web-dev-qa-db-fra.com

Comment fusionner des listes dans une liste de tuples?

Quelle est l'approche Pythonic pour atteindre les objectifs suivants?

# Original lists:

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

# List of tuples from 'list_a' and 'list_b':

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

Chaque membre de list_c est un tuple dont le premier membre provient de list_a et le second de list_b.

263
rubayeet

Dans 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)]

Dans 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)]
376
YOU

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

138
Lodewijk

Vous pouvez utiliser la carte 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

11
Dark Knight

Vous recherchez la fonction intégrée Zip .

8
Mizipzor

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))]
6
Vipin

Je sais que c’est une vieille question à laquelle on a déjà répondu, mais pour une raison quelconque, je veux toujours poster cette solution alternative. Je sais qu'il est facile de savoir quelle fonction intégrée fait la "magie" dont vous avez besoin, mais cela ne fait pas de mal de savoir que vous pouvez le faire vous-même.

>>> list_1 = ['Ace', 'King']
>>> list_2 = ['Spades', 'Clubs', 'Diamonds']
>>> deck = []
>>> for i in range(max((len(list_1),len(list_2)))):
        while True:
            try:
                card = (list_1[i],list_2[i])
            except IndexError:
                if len(list_1)>len(list_2):
                    list_2.append('')
                    card = (list_1[i],list_2[i])
                Elif len(list_1)<len(list_2):
                    list_1.append('')
                    card = (list_1[i], list_2[i])
                continue
            deck.append(card)
            break
>>>
>>> #and the result should be:
>>> print deck
>>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')]
5
Kruger

La sortie que vous avez montrée dans l'énoncé du problème n'est pas le tuple mais la liste

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

vérifier

type(list_c)

considérant que vous voulez que le résultat soit Tuple hors de list_a et list_b, faites

Tuple(Zip(list_a,list_b)) 
5
cyborg

Une alternative sans utiliser Zip:

list_c = [(p1, p2) for idx1, p1 in enumerate(list_a) for idx2, p2 in enumerate(list_b) if idx1==idx2]

Au cas où l’on voudrait obtenir non seulement des tuples 1er à 1er, 2ème au 2ème ... mais toutes les combinaisons possibles des 2 listes, cela se ferait avec

list_d = [(p1, p2) for p1 in list_a for p2 in list_b]
1
J0ANMM