2017-09-30 2 views
1

disons que j'ai une liste de tuples. Je veux mettre le deuxième élément de tous les tuples dans leur propre liste tout en préservant l'ordre original. Y a-t-il des moyens rapides et sales de le faire?Prendre des valeurs dans une liste de tuple et mettre dans une autre liste?

exemple avant le tri.

[(0,'apple'), 
(1,'pineapple'), 
(11,'cherry'), 
(12,'banana'), 
(13,'mango'), 
(14,'boot'), 
(15,'mangosteen')] 

après le tri

['apple', 
'pineapple', 
'cherry', 
'banana', 
'mango', 
'boot', 
'mangosteen'] 

Répondre

3

Vous venez essentiellement besoin de cartographier le fonctionnement d'obtenir l'élément à l'index 1 de chaque tuple dans une liste et produire une nouvelle liste.

Étant donné:

>>> LoT 
[(0, 'apple'), (1, 'pineapple'), (11, 'cherry'), (12, 'banana'), (13, 'mango'), (14, 'boot'), (15, 'mangosteen')] 

Vous pouvez utiliser une compréhension de la liste et accéder à l'élément d'intérêt de chaque tuple:

>>> [t[1] for t in LoT] 
['apple', 'pineapple', 'cherry', 'banana', 'mango', 'boot', 'mangosteen'] 

Vous pouvez utiliser décompactage tuple:

>>> [b for _,b in LoT] 
['apple', 'pineapple', 'cherry', 'banana', 'mango', 'boot', 'mangosteen'] 

qui échoue si le tuple n'a que 2 éléments de long.

Vous pouvez également utiliser zip:

>>> list(zip(*LoT))[1] 
('apple', 'pineapple', 'cherry', 'banana', 'mango', 'boot', 'mangosteen') 

Vous pouvez utiliser un itemgetter avec map:

>>> list(map(itemgetter(1),LoT)) 
['apple', 'pineapple', 'cherry', 'banana', 'mango', 'boot', 'mangosteen'] 

Avec python3 vous devez utiliser list autour zip pour indicer le premier élément ou autour map pour le montrer. Combiné avec des boucles ou un autre contrôle de flux dans Python 3, vous n'auriez probablement pas besoin de ça.

Le premier, [t[1] for t in LoT], est le plus idiomatique et le dernier, map(itemgetter(1),LoT) peut-être le plus rapide.

+0

Comment s'appelle cette structure de données? Quand je branche "t [1] pour t dans LoT" ma console dit que c'est un type de générateur. – Justin

+0

Mettez dans la console * exactement * ce que j'ai fait et qui devrait fonctionner. Ensuite, travaillez en arrière à partir de là pour vous servir de cas. Vous devez utiliser '[...]' pour obtenir une compréhension de la liste. – dawg

+0

Je l'ai fait et ça marche, je me demandais comment faire référence dans le futur. Radish dit que ça s'appelle "tuple unpacking"? – Justin

2

Tuple déballage comme alternative.

[b for a,b in lst]