362 votes

Comment fusionner des listes en une liste de tuples?

Quelle est l'approche pythonique pour réaliser ce qui suit?

# Listes d'origine:

list_a = [1, 2, 3, 4]
list_b = [5, 6, 7, 8]

# Liste de tuples à partir de 'list_a' et 'list_b':

list_c = [(1,5), (2,6), (3,7), (4,8)]

Chaque élément de list_c est un tuple, dont le premier élément provient de list_a et le deuxième de list_b.

548voto

YOU Points 44812

En Python 2:

>>> list_a = [1, 2, 3, 4]
>>> list_b = [5, 6, 7, 8]
>>> zip(list_a, list_b)
[(1, 5), (2, 6), (3, 7), (4, 8)]

En Python 3:

>>> list_a = [1, 2, 3, 4]
>>> list_b = [5, 6, 7, 8]
>>> list(zip(list_a, list_b))
[(1, 5), (2, 6), (3, 7), (4, 8)]

94 votes

Vous devez savoir que la fonction zip s'arrête à la fin de la liste la plus courte, ce qui n'est peut-être pas toujours ce que vous voulez. Le module itertools définit une méthode zip_longest() qui s'arrête à la fin de la liste la plus longue, en remplissant les valeurs manquantes avec quelque chose que vous fournissez en tant que paramètre.

6 votes

@Adrien: merci pour votre commentaire approprié. Pour Python 2.x, s/zip_longest()/izip_longest(). Renommé en Python 3.x en zip_longest().

0 votes

Est-ce que je pourrais créer [(1,5), (1,6), (1,7), (1,8), (2,5), (2,6), etc.] en utilisant la commande zip?

147voto

Lodewijk Points 283

En python 3.0, zip renvoie un objet zip. Vous pouvez obtenir une liste en appelant list(zip(a, b)).

3 votes

Cela pourrait sembler trivial, mais soyez averti que l'utilisation directe de ceci dans une boucle for vous donne un générateur qui sera épuisé après une seule utilisation. Sauvegardez-le dans une variable si vous voulez l'utiliser plus souvent.

16voto

Dark Knight Points 709

Vous pouvez utiliser map lambda

a = [2,3,4]
b = [5,6,7]
c = map(lambda x,y:(x,y),a,b)

Cela fonctionnera également si les longueurs des listes originales ne correspondent pas

1 votes

Pourquoi utiliser une lambda? map(None, a,b)

0 votes

Je n'ai accès qu'à python 3.5.

3 votes

Si vous utilisiez python3 alors c ne serait pas une liste mais un objet map, également l'utilisation d'une lambda va être beaucoup moins efficace que simplement faire un zipping, si vous avez des listes de longueurs différentes et que vous voulez gérer cela alors vous utiliseriez izip_longest/zip_longest

8voto

Mizipzor Points 10952

Vous recherchez la fonction intégrée zip.

7voto

Vipin Points 21

Je ne suis pas sûr que ce soit une manière pythonique ou non mais cela semble simple si les deux listes ont le même nombre d'éléments :

list_a = [1, 2, 3, 4]

list_b = [5, 6, 7, 8]

list_c=[(list_a[i],list_b[i]) for i in range(0,len(list_a))]

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