在Python中通过切片列表来紧凑地赋值

46 投票
5 回答
3353 浏览
提问于 2025-04-18 00:38

我有以下这个列表

bar = ['a','b','c','x','y','z']

我想把bar中的第1、第4和第5个值分别赋给v1v2v3,有没有更简洁的方法来做到这一点,而不是像这样:

v1, v2, v3 = [bar[0], bar[3], bar[4]]

因为在Perl语言中,你可以这样做:

my($v1, $v2, $v3) = @bar[0,3,4];

5 个回答

7

还有另一种方法:

from itertools import compress

bar = ['a','b','c','x','y','z']
v1, v2, v3 = compress(bar, (1, 0, 0, 1, 1, 0))

另外,你可以忽略列表的长度,并且在选择器的末尾跳过零:

v1, v2, v3 = compress(bar, (1, 0, 0, 1, 1,))

https://docs.python.org/2/library/itertools.html#itertools.compress

21

numpy 中,你可以用一个包含索引的数组来索引另一个数组。这样可以让你的代码写得非常简洁,正如你所希望的那样:

In [1]: import numpy as np
In [2]: bar = np.array(['a','b','c','x','y','z'])
In [3]: v1, v2, v3 = bar[[0, 3, 4]]
In [4]: print v1, v2, v3
a x y

不过,对于你这种简单的情况,使用 numpy 可能有点过于复杂。我提到它只是为了完整性,以防你需要处理大量数据时用到。

35

因为你想要简洁的写法,可以这样做:

indices = (0,3,4)
v1, v2, v3 = [bar[i] for i in indices]

>>> print v1,v2,v3     #or print(v1,v2,v3) for python 3.x
a x y
44

假设你的索引既不是动态的,也不是太大的话,我建议使用

bar = ['a','b','c','x','y','z']
v1, _, _, v2, v3, _ = bar
87

你可以使用 operator.itemgetter 这个工具:

>>> from operator import itemgetter
>>> bar = ['a','b','c','x','y','z']
>>> itemgetter(0, 3, 4)(bar)
('a', 'x', 'y')

所以对于你的例子,你可以这样做:

>>> v1, v2, v3 = itemgetter(0, 3, 4)(bar)

撰写回答