45 votes

Façon compacte d'assigner des valeurs en découpant une liste en Python

J'ai la liste suivante

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

Ce que je veux faire, c'est assigner les valeurs 1, 4 et 5 de l'adresse de l'utilisateur. bar sur v1,v2,v3 , Existe-t-il un moyen plus compact de procéder ainsi ?

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

Parce qu'en Perl, vous pouvez faire quelque chose comme ça :

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

87voto

Ashwini Chaudhary Points 94431

Vous pouvez utiliser operator.itemgetter :

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

Donc, pour votre exemple, vous devez faire ce qui suit :

>>> v1, v2, v3 = itemgetter(0, 3, 4)(bar)

44voto

Bergi Points 104242

En supposant que vos indices ne sont ni dynamiques, ni trop grands, je choisirais plutôt

bar = ['a','b','c','x','y','z']
v1, _, _, v2, v3, _ = bar

35voto

sshashank124 Points 15905

Puisque vous voulez de la compacité, vous pouvez le faire comme suit :

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

21voto

Bas Swinckels Points 7613

Sur numpy vous pouvez indexer un tableau avec un autre tableau qui contient des indices. Cela permet d'obtenir une syntaxe très compacte, exactement comme vous le souhaitez :

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

L'utilisation de numpy est très probablement excessive pour votre cas simple. Je ne le mentionne que par souci d'exhaustivité, au cas où vous auriez besoin de faire la même chose avec de grandes quantités de données.

7voto

Yuriy Kovalev Points 406

Une autre méthode encore :

from itertools import compress

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

En outre, vous pouvez ignorer la longueur de la liste et ignorer les zéros à la fin des sélecteurs :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X