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

pdu*_*ois 45 python list slice

我有以下清单

bar = ['a','b','c','x','y','z']
Run Code Online (Sandbox Code Playgroud)

我想要做的就是分配1,第4和第5的值barv1,v2,v3,有没有更紧凑的方式比这做的事:

v1, v2, v3 = [bar[0], bar[3], bar[4]]
Run Code Online (Sandbox Code Playgroud)

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

my($v1, $v2, $v3) = @bar[0,3,4];
Run Code Online (Sandbox Code Playgroud)

Ash*_*ary 87

你可以使用operator.itemgetter:

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

因此,对于您的示例,您将执行以下操作:

>>> v1, v2, v3 = itemgetter(0, 3, 4)(bar)
Run Code Online (Sandbox Code Playgroud)

  • `从运算符导入项目作为ig`简称. (2认同)

Ber*_*rgi 44

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

bar = ['a','b','c','x','y','z']
v1, _, _, v2, v3, _ = bar
Run Code Online (Sandbox Code Playgroud)

  • +1表示简单.确切地说,它应该是'v1,_,_,v2,v3,_`,因为问题是针对索引0,3和4. (7认同)

ssh*_*124 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
Run Code Online (Sandbox Code Playgroud)

  • @ user3075942,这就是我之前的情况,但是当我运行它很多时候`list`时间较低. (3认同)

Bas*_*els 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
Run Code Online (Sandbox Code Playgroud)

对于你的简单案例,使用numpy很可能是矫枉过正.我只是提到它的完整性,以防你需要对大量数据做同样的事情.


Yur*_*lev 7

又一种方法:

from itertools import compress

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

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

v1, v2, v3 = compress(bar, (1, 0, 0, 1, 1,))
Run Code Online (Sandbox Code Playgroud)

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

  • 如果索引表示为某种位掩码而不是直接数字,"压缩"将是更简单的解决方案.例如,如果以这种方式计算它们:`(data_related_with_bar中x的is_index_needed(x))` (2认同)