708 votes

Comment puis-je obtenir la concaténation de deux listes en Python sans modifier l'une ou l'autre ?

En Python, le seul moyen que je trouve pour concaténer deux listes est list.extend qui modifie la première liste. Existe-t-il une fonction de concaténation qui renvoie son résultat sans modifier ses arguments ?

1151voto

NPE Points 169956

Oui : list1 + list2 . Cela donne une nouvelle liste qui est la concaténation de list1 y list2 .

3 votes

Eh bien, ça explique tout. Je cherchais un nom de fonction, pas un opérateur (Oui, je sais que les opérateurs sont implémentés par des fonctions cachées).

34 votes

En fait, vous pouvez le faire en utilisant une fonction non cachée : import operator, operator.add(list1, list2)

18 votes

Reduce(operator.add, [[1,2], [3,4], [5,6]]) == [1,2,3,4,5,6]. Ou vous pouvez utiliser itertools.chain à la place de operator.add

173voto

Scott Griffiths Points 8867

La méthode la plus simple consiste à utiliser l'option + qui renvoie la concaténation des listes :

concat = first_list + second_list

L'un des inconvénients de cette méthode est que l'on utilise deux fois plus de mémoire. Pour les très grandes listes, tout dépend de l'usage que l'on va en faire une fois qu'elles seront créées, itertools.chain pourrait être votre meilleure chance :

>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)

Cela crée un générateur pour les éléments de la liste combinée, ce qui présente l'avantage qu'aucune nouvelle liste ne doit être créée, mais vous pouvez toujours utiliser la fonction c comme s'il s'agissait de la concaténation des deux listes :

>>> for i in c:
...     print i
1
2
3
4
5
6

Si vos listes sont volumineuses et que l'efficacité est un souci, cette méthode et d'autres méthodes de l'outil de gestion des listes de diffusion de la Commission européenne peuvent être utilisées. itertools sont très pratiques à connaître.

Notez que cet exemple utilise tous les éléments de c Vous devez donc le réinitialiser avant de pouvoir le réutiliser. Bien sûr, vous pouvez simplement utiliser list(c) pour créer la liste complète, mais cela créera une nouvelle liste en mémoire.

11 votes

Dites simplement que itertools.chain renvoie un générateur...

117voto

kotlinski Points 12815

concatenated_list = list_1 + list_2

0 votes

@Johan, mon vote pour la réponse la plus courte. Personne n'a remarqué que > marqué comme doublon par la Communauté le 11 mai '15 à 17:15 < a été ajouté en 2015 ? ! Que s'est-il passé avec le moteur de recherche SOF en novembre/décembre 2010 ? Il aurait pu être marqué comme duplicate à l'époque, je pense.

0 votes

Répondre par une question n'est pas très assertif. L'autre réponse mérite plus de votes.

102voto

Thomas Ahle Points 10403

Vous pouvez également utiliser sum si vous lui donnez un start argument :

>>> list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
>>> all_lists = sum([list1, list2, list3], [])
>>> all_lists
[1, 2, 3, 'a', 'b', 'c', 7, 8, 9]

Cela fonctionne en général pour tout ce qui a l'attribut + opérateur :

>>> sum([(1,2), (1,), ()], ())
(1, 2, 1)

>>> sum([Counter('123'), Counter('234'), Counter('345')], Counter())
Counter({'1':1, '2':2, '3':3, '4':2, '5':1})

>>> sum([True, True, False], False)
2

À l'exception notable des cordes :

>>> sum(['123', '345', '567'], '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

4 votes

Sur Python 3.5.2, sum est documenté pour dire "Cette fonction est destinée spécifiquement à être utilisée avec des valeurs numériques et peut rejeter des types non numériques". Je ne suis donc pas sûr sum doit être utilisé comme ceci.

0 votes

Bien vu pour la documentation. C'est drôle qu'ils n'aient pas simplement rejeté les valeurs non numériques, plutôt que d'enterrer l'intention dans la documentation.

45voto

pyfunc Points 31088

Vous pouvez toujours créer une nouvelle liste qui est le résultat de l'addition de deux listes.

>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]

Les listes étant des séquences mutables, je pense qu'il est logique de modifier les listes originales par extend ou append.

2 votes

La modification des listes originales n'a de sens que si vous n'avez plus besoin des listes non modifiées, ce qui n'est pas le cas ici.

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