110 votes

Entrelacer plusieurs listes de même longueur en Python

En Python, existe-t-il un bon moyen d'entrelacer deux listes de même longueur ?

Dites que je suis donné [1,2,3] et [10,20,30] . J'aimerais les transformer en [1,10,2,20,3,30] .

0 votes

Non recommandé, mais essayez ceci : it = iter(l1); list((yield next(it)) or i for i in l2)

0 votes

3voto

robert king Points 5369

Je préfère la solution d'Aix. Voici une autre solution qui devrait fonctionner en 2.2 :

>>> x=range(3)
>>> x
[0, 1, 2]
>>> y=range(7,10)
>>> y
[7, 8, 9]
>>> sum(zip(x,y),[])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
>>> sum(map(list,zip(x,y)),[])
[0, 7, 1, 8, 2, 9]

et un autre moyen :

>>> a=[x,y]
>>> [a[i][j] for j in range(3) for i in (0,1)]
[0, 7, 1, 8, 2, 9]

et :

>>> sum((list(i) for i in zip(x,y)),[])
[0, 7, 1, 8, 2, 9]

0voto

jon_darkstar Points 8767
[el for el in itertools.chain(*itertools.izip_longest([1,2,3], [4,5])) if el is not None]

Tant que vous n'avez pas None que vous voulez garder

0voto

eqzx Points 709

Pour répondre au titre de la question "Intercaler plusieurs listes de même longueur en Python", nous pouvons généraliser la réponse à 2 listes de @ekhumoro. Cela nécessite explicitement que les listes soient de la même longueur, contrairement à la solution (élégante) de @NPE

import itertools

def interleave(lists):
    """Interleave a list of lists.

    :param lists: List of lists; each inner length must be the same length.
    :returns: interleaved single list
    :rtype: list

    """
    if len(set(len(_) for _ in lists)) > 1:
        raise ValueError("Lists are not all the same length!")
    joint = list(itertools.chain(*lists))
    for l_idx, li in enumerate(lists):
        joint[l_idx::len(lists)] = li
    return joint

Exemples :

>>> interleave([[0,2,4], [1, 3, 5]])
[0, 1, 2, 3, 4, 5]
>>> interleave([[0,2,4], [1, 3, 5], [10, 11, 12]])
[0, 1, 10, 2, 3, 11, 4, 5, 12]
>>> interleave([[0,2,4], [1, 3, 5], [10, 11, 12], [13, 14, 15]])
[0, 1, 10, 13, 2, 3, 11, 14, 4, 5, 12, 15]
>>> interleave([[0,2,4], [1, 3, 5], [10, 11, 12], [13, 14]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in interleave
ValueError: Lists are not all the same length!
>>> interleave([[0,2,4]])
[0, 2, 4]

0voto

Amit Yadav Points 787

Il arrive trop tard et les bonnes réponses ne manquent pas, mais je voudrais aussi apporter une solution simple en utilisant extend() méthode :

list1 = [1, 2, 3]
list2 = [10, 20, 30]

new_list = []
for i in range(len(list1)):
    new_list.extend([list1[i], list2[i]])
print(new_list)

Sortie :

[1, 10, 2, 20, 3, 30]

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