Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compact way to assign values by slicing list in Python

Tags:

python

list

slice

I have the following list

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

What I want to do is to assign 1st, 4th and 5th values of bar into v1,v2,v3, is there a more compact way to do than this:

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

Because in Perl you can do something like this:

my($v1, $v2, $v3) = @bar[0,3,4];
like image 778
pdubois Avatar asked Mar 31 '14 08:03

pdubois


4 Answers

You can use operator.itemgetter:

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

So for your example you would do the following:

>>> v1, v2, v3 = itemgetter(0, 3, 4)(bar)
like image 135
Ashwini Chaudhary Avatar answered Oct 19 '22 20:10

Ashwini Chaudhary


Assuming that your indices are neither dynamic nor too large, I'd go with

bar = ['a','b','c','x','y','z']
v1, _, _, v2, v3, _ = bar
like image 23
Bergi Avatar answered Oct 19 '22 19:10

Bergi


Since you want compactness, you can do it something as follows:

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
like image 35
sshashank124 Avatar answered Oct 19 '22 19:10

sshashank124


In numpy, you can index an array with another array that contains indices. This allows for very compact syntax, exactly as you want:

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

Using numpy is most probably overkill for your simple case. I just mention it for completeness, in case you need to do the same with large amounts of data.

like image 21
Bas Swinckels Avatar answered Oct 19 '22 19:10

Bas Swinckels