Comment concaténer deux listes en Python?
Exemple:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Résultat attendu:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
Comment concaténer deux listes en Python?
Exemple:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Résultat attendu:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
[1,2,5] and [2,4,5,6]
? Voulez-vous que les doublons soient inclus, exclus ou peu importe?Réponses:
Vous pouvez utiliser l'
+
opérateur pour les combiner:Production:
la source
listone += listtwo
résultats danslistone == [1, 2, 3, 4, 5, 6]
list3 = listone
listone+=listtwo
liste3 a-t-elle également changé?Il est également possible de créer un générateur qui itère simplement sur les éléments des deux listes à l'aide de
itertools.chain()
. Cela vous permet de chaîner des listes (ou tout itérable) ensemble pour les traiter sans copier les éléments dans une nouvelle liste:la source
chain
est plus lent (mais pas beaucoup) pour deux listes, mais est la solution la plus rapide pour chaîner plusieurs listes (n >> 2).>= 3.5
Alternative à Python :[*l1, *l2]
Une autre alternative a été introduite via l'acceptation
PEP 448
qui mérite d'être mentionnée.Le PEP, intitulé Additional Unpacking Generalizations , a généralement réduit certaines restrictions syntaxiques lors de l'utilisation de l'
*
expression étoilée en Python; avec elle, la jonction de deux listes (s'applique à tout itérable) peut désormais aussi se faire avec:Cette fonctionnalité a été définie pour Python,
3.5
elle n'a pas été rétroportée vers les versions précédentes de la3.x
famille. Dans les versions non prises en charge, unSyntaxError
va être augmenté.Comme pour les autres approches, cela crée également une copie superficielle des éléments dans les listes correspondantes.
L' avantage de cette approche est que vous n'avez vraiment pas besoin de listes pour l'exécuter, tout ce qui est itérable fera l'affaire. Comme indiqué dans le PEP:
Ainsi, alors que l'ajout avec
+
soulèverait uneTypeError
incompatibilité due au type:Les éléments suivants ne seront pas:
car il déballera d'abord le contenu des itérables puis créera simplement un à
list
partir du contenu.la source
res = [*l1, *reversed(l2)]
. Puisquereversed
renvoie un itérateur,res = l1 + reversed(l2)
lancerait une erreur.Vous pouvez utiliser des ensembles pour obtenir une liste fusionnée de valeurs uniques
la source
listone + [x for x in listtwo if x not in listone]
import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))
fera l'affaire.Vous pouvez également utiliser la
list.extend()
méthode afin d'ajouter unlist
à la fin d'un autre:Si vous souhaitez conserver la liste d'origine intacte, vous pouvez créer un nouvel
list
objet et lesextend
deux listes:la source
Depuis la version 3.7, ce sont les méthodes stdlib les plus populaires pour concaténer deux (ou plus) listes en python.
Performance
Concaténation 2 listes 1
Il n'y a pas beaucoup de différence entre ces méthodes mais cela a du sens étant donné qu'elles ont toutes le même ordre de complexité (linéaire). Il n'y a aucune raison particulière de préférer l'un à l'autre, sauf pour une question de style.
Concaténation de N-List
Les tracés ont été générés à l'aide du module perfplot . Code, pour votre référence.
1. Le
iadd
(+=
) et lesextend
méthodes fonctionnent en place, une copie doit donc être générée à chaque fois avant le test. Pour garder les choses justes, toutes les méthodes ont une étape de pré-copie pour la liste de gauche qui peut être ignorée.Commentaires sur d'autres solutions
N'UTILISEZ PAS LA MÉTHODE DUNDER
list.__add__
directement de quelque manière, forme ou forme. En fait, évitez les méthodes de détournement et utilisez les opérateurs et lesoperator
fonctions pour lesquels ils ont été conçus. Python a une sémantique minutieuse intégrée à ceux-ci qui sont plus compliqués que d'appeler directement le connard. Voici un exemple . Donc, pour résumer,a.__add__(b)
=> BAD;a + b
=> BON.Certaines réponses offrent ici
reduce(operator.add, [a, b])
une concaténation par paire - c'est la même chosesum([a, b], [])
que plus verbeux.Toute méthode qui utilise
set
supprimera les doublons et perdra l'ordre. Utiliser avec précaution.for i in b: a.append(i)
est plus verbeux et plus lent quea.extend(b)
, qui est un appel à fonction unique et plus idiomatique.append
est plus lent en raison de la sémantique avec laquelle la mémoire est allouée et développée pour les listes. Voir ici pour une discussion similaire.heapq.merge
fonctionnera, mais son cas d'utilisation est pour la fusion de listes triées en temps linéaire. L'utiliser dans toute autre situation est un anti-modèle.yield
Lier des éléments de liste à partir d'une fonction est une méthode acceptable, mais elle lechain
fait plus rapidement et mieux (elle a un chemin de code en C, donc c'est rapide).operator.add(a, b)
est un équivalent fonctionnel acceptable dea + b
. Ses cas d'utilisation sont principalement pour l'envoi de méthode dynamique. Sinon, préféreza + b
ce qui est plus court et plus lisible, à mon avis . YMMV.la source
"There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
"Solutions non listées dans ma réponse, ou critiquées dans" Commentaires "Je recommande de ne pas les utiliser.C'est assez simple, et je pense que cela a même été montré dans le tutoriel :
la source
Cette question pose directement la question de joindre deux listes. Cependant, il est assez élevé dans la recherche même lorsque vous recherchez un moyen de joindre de nombreuses listes (y compris le cas lorsque vous rejoignez des listes nulles).
Je pense que la meilleure option est d'utiliser des listes de compréhension:
Vous pouvez également créer des générateurs:
Ancienne réponse
Considérez cette approche plus générique:
Sortira:
Notez que cela fonctionne également correctement lorsque
a
est[]
ou[[1,2,3]]
.Cependant, cela peut être fait plus efficacement avec
itertools
:Si vous n'avez pas besoin d'un
list
, mais simplement d'un itérable, omettezlist()
.Mise à jour
L'alternative suggérée par Patrick Collins dans les commentaires pourrait également vous convenir:
la source
reduce
est désormais disponiblefunctools
, vous devrez donc l'importer en premier.Vous pouvez simplement utiliser l' opérateur
+
or+=
comme suit:Ou:
De plus, si vous voulez que les valeurs de la liste fusionnée soient uniques, vous pouvez faire:
la source
list(dict.fromkeys(a + b))
Il convient de noter que la
itertools.chain
fonction accepte un nombre variable d'arguments:Si un itérable (tuple, liste, générateur, etc.) est l'entrée, la
from_iterable
méthode de classe peut être utilisée:la source
Avec Python 3.3+, vous pouvez utiliser le rendement de :
Ou, si vous souhaitez prendre en charge un nombre arbitraire d'itérateurs:
la source
itertools.chain
(ce qui est équivalent) au lieu de définir votre propre fonction.Si vous souhaitez fusionner les deux listes sous forme triée, vous pouvez utiliser la
merge
fonction de laheapq
bibliothèque.la source
Si vous ne pouvez pas utiliser l'opérateur plus (
+
), vous pouvez utiliser l'operator
importation:Alternativement, vous pouvez également utiliser la fonction
__add__
dunder :la source
+
est hors de la table, utilisezoperator.add
.Comme moyen plus général pour plus de listes, vous pouvez les mettre dans une liste et utiliser la fonction
itertools.chain.from_iterable()
1 qui, sur la base de cette réponse, est le meilleur moyen d'aplatir une liste imbriquée:1. Notez qu'il
chain.from_iterable()
est disponible dans Python 2.6 et versions ultérieures. Dans d'autres versions, utilisezchain(*l)
.la source
Si vous devez fusionner deux listes ordonnées avec des règles de tri complexes, vous devrez peut-être les faire rouler vous-même comme dans le code suivant (en utilisant une règle de tri simple pour plus de lisibilité :-)).
la source
heapq.merge
.Vous pouvez utiliser la
append()
méthode définie sur leslist
objets:la source
Le code ci-dessus, ne préserve pas l'ordre, supprime les doublons de chaque liste (mais pas de la liste concaténée)
la source
Comme plusieurs l'ont déjà souligné,
itertools.chain()
c'est la voie à suivre si l'on doit appliquer exactement le même traitement aux deux listes. Dans mon cas, j'avais une étiquette et un drapeau qui étaient différents d'une liste à l'autre, j'avais donc besoin de quelque chose d'un peu plus complexe. En fin de compte, dans les coulisses faititertools.chain()
simplement ce qui suit:(voir https://docs.python.org/2/library/itertools.html ), donc je me suis inspiré d'ici et j'ai écrit quelque chose dans ce sens:
Les principaux points à comprendre ici sont que les listes ne sont qu'un cas particulier d'itérables, qui sont des objets comme les autres; et que les
for ... in
boucles en python peuvent fonctionner avec des variables de tuple, il est donc simple de boucler sur plusieurs variables en même temps.la source
Utilisez une compréhension de liste simple:
Il présente tous les avantages de la nouvelle approche d'utilisation généralisations de décompression supplémentaires - c'est-à-dire que vous pouvez concaténer un nombre arbitraire d'itérables différents (par exemple, des listes, des tuples, des plages et des générateurs) de cette façon - et ce n'est pas limité à Python 3.5 ou version ultérieure .
la source
Une façon très concise de combiner une liste de listes est
ce qui nous donne
la source
list.__add__
, utilisezoperator.add
plutôt. C'est l'équivalent le plus verbeuxsum(list_of_lists, [])
qui est tout aussi mauvais. NE PAS UTILISER!obj.__class__
etobj.__dict__
.En Python, vous pouvez concaténer deux tableaux de dimensions compatibles avec cette commande
la source
Il y a donc deux façons simples.
+
: il crée une nouvelle liste à partir des listes fourniesExemple:
Exemple:
Ainsi, nous voyons que sur deux des méthodes les plus populaires,
extend
est efficace.la source
chain.from_iterable
).Il existe plusieurs façons de concaténer des listes en python.
la source
Production:
la source
Si vous vouliez une nouvelle liste tout en conservant les deux anciennes listes:
la source
la source
Vous pouvez suivre le code
la source