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, bar, bar]
``````

Because in Perl you can do something like this:

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

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)
``````

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
``````

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
``````

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

``````In : import numpy as np
In : bar = np.array(['a','b','c','x','y','z'])
In : v1, v2, v3 = bar[[0, 3, 4]]
In : 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.

Yet another method:

``````from itertools import compress

bar = ['a','b','c','x','y','z']
v1, v2, v3 = compress(bar, (1, 0, 0, 1, 1, 0))
``````

In addition, you can ignore length of the list and skip zeros at the end of selectors:

``````v1, v2, v3 = compress(bar, (1, 0, 0, 1, 1,))
``````

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