Компактный способ присвоения значений списком разрезов в Python
У меня есть следующий список
bar = ['a','b','c','x','y','z']
Что я хочу сделать, это присвоить 1, 4 и 5 значениям bar
в v1,v2,v3
,
существует более компактный способ сделать это:
v1, v2, v3 = [bar[0], bar[3], bar[4]]
Потому что в Perl вы можете сделать что-то вроде этого:
my($v1, $v2, $v3) = @bar[0,3,4];
Ответы
Ответ 1
Вы можете использовать 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)
Ответ 2
Предполагая, что ваши индексы не являются ни динамичными, ни слишком большими, я бы пошел с
bar = ['a','b','c','x','y','z']
v1, _, _, v2, v3, _ = bar
Ответ 3
Поскольку вы хотите компактность, вы можете сделать что-то следующим образом:
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
Ответ 4
В 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 скорее всего будет излишним для вашего простого случая. Я просто упомянул об этом для полноты, если вам нужно сделать то же самое с большими объемами данных.
Ответ 5
Еще один способ:
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