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]
.
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]
.
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]
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]
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 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.
0 votes
Non recommandé, mais essayez ceci :
it = iter(l1); list((yield next(it)) or i for i in l2)
0 votes
Cela répond-il à votre question ? Méthode pythonique pour combiner deux listes de manière alternée ?