Interleave plusieurs listes de même longueur en Python
En Python, est-il un bon moyen d'intercaler les deux listes de même longueur?
Dire que je suis donné [1,2,3]
et [10,20,30]
. Je voudrais les transformer en [1,10,2,20,3,30]
.
- Vous vous rendez compte que la 2.2 est maintenant de dix ans? Il n'y a pas de raison d'être encore à l'utiliser.
- Je ne. Dans ce cas, je n'ai pas de choix.
- N'est pas recommandé, mais essayez ceci:
it = iter(l1); list((yield next(it)) or i for i in l2)
- Pour plus d'options, ainsi que la comparaison des performances sur la liste de l'entrelacement, voir ce post.
InformationsquelleAutor NPE | 2011-10-30
Vous devez vous connecter pour publier un commentaire.
Avoir posté la question, j'ai réalisé que je peux tout simplement faire ce qui suit:
où
l1
etl2
sont les deux listes.Si il y a N listes interleave, puis
Pour plus de recettes, suivez Meilleure façon d'intercaler une liste avec le suffixe valeurs. Certaines de ces méthodes ont démontré il y a peut être généralisée à deux ou plusieurs listes de même longueur.
izip_longest
pour python2 etzip_longest
pour python3 `[val for pair in itertools.zip_longest(l1, l2) for val in pair]
résultats avec['a', 'b', 'a', 'b', 'a', 'b', None, 'b', None, 'b', None, 'b']
Pour Python>=2.3, il y a tranche étendue de la syntaxe:
La ligne
c = a + b
est utilisé comme un moyen simple de créer une nouvelle liste de exactement la bonne longueur (à ce stade, son contenu n'est pas important). Les deux lignes de faire le travail réel de l'entrelacement de laa
etb
: le premier attribue les éléments dea
pour toutes les paires d'indices dec
; le second, on affecte les éléments deb
à tous les impaires indices dec
.Donné
Code
En supposant que les listes de même longueur, vous pouvez obtenir un entrelacé liste avec
itertools.chain
etzip
:Alternatives
itertools.zip_longest
Plus généralement, avec l'inégalité de listes, utilisez
zip_longest
(recommandé):De nombreuses listes peuvent en toute sécurité être entrelacées:
more_itertools
+Une bibliothèque fournie avec le
roundrobin
itertools recette,interleave
etinterleave_longest
.yield from
Enfin, pour quelque chose d'intéressant dans Python 3 (non recommandé):
+d'Installer à l'aide de
pip install more_itertools
Alternative:
Cela fonctionne parce que carte travaille sur les listes en parallèle. Il fonctionne de la même sous 2.2. Par lui-même, avec
None
que les fonctions appelées,map
produit une liste de tuples:Puis aplatir un peu la liste de tuples.
L'avantage, bien sûr, est
map
va travailler pour un certain nombre de listes et de travail, même si elles sont de longueurs différentes:if y
filtre0
trop,if y is not None
est moins fragile.J'ai besoin d'un moyen de le faire avec des listes de différentes tailles que l'on a accepté la réponse n'a pas d'adresse.
Ma solution utilise un générateur et de son utilisation ressemble un peu plus à cause de cela:
Et de son utilisation:
J'aime aix la solution la meilleure. voici une autre façon, je pense, devrait travailler en 2.2:
et d'une façon de plus:
et:
Tant que vous n'avez pas
None
que vous souhaitez conserverPour répondre à la question du titre de "Entrelacement de multiples listes de même longueur en Python", on peut généraliser le 2-liste de réponse de @ekhumoro. Cela exige explicitement que les listes sont de la même longueur, à la différence de l' (élégant) solution par @NPE
Exemples:
Trop tard pour le parti, et il y a beaucoup de bonnes réponses, mais je tiens également à fournir une solution simple à l'aide de
extend()
méthode:De sortie: