通过Python中的切片列表分配值的紧凑方法

我有以下清单

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];
pdubois asked 2020-06-29T17:53:03Z
5个解决方案
87 votes

您可以使用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)
Ashwini Chaudhary answered 2020-06-29T17:53:37Z
44 votes

假设您的索引既不是动态的也不是太大,我会选择

bar = ['a','b','c','x','y','z']
v1, _, _, v2, v3, _ = bar
Bergi answered 2020-06-29T17:53:57Z
35 votes

由于要紧凑,因此可以执行以下操作:

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
sshashank124 answered 2020-06-29T17:54:17Z
21 votes

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可能是过大的。 我只是为了完整性而提到它,以防万一您需要对大量数据进行同样的处理。

Bas Swinckels answered 2020-06-29T17:54:42Z
7 votes

还有另一种方法:

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/ITER tools.HTML#ITER tools.compress]

Yuriy Kovalev answered 2020-06-29T17:55:12Z
translate from https://stackoverflow.com:/questions/22756632/compact-way-to-assign-values-by-slicing-list-in-python