通过在Python中切片列表来分配值的紧凑方式

时间:2014-03-31 08:15:21

标签: python list slice

我有以下列表

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

我想要做的是将bar的第1,第4和第5个值分配到v1,v2,v3, 有没有比这更简洁的方法:

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

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

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

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分:44)

假设您的指数既不动态也不太大,我会选择

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

答案 2 :(得分: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

答案 3 :(得分:21)

numpy中,您可以索引包含索引的数组with another array。这允许非常紧凑的语法,完全按照您的要求:

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很可能是矫枉过正。我只是提到它是为了完整性,以防你需要对大量数据做同样的事情。

答案 4 :(得分: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