web-dev-qa-db-fra.com

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

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

621
Ryan Thompson

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

1058
NPE

En fonction de la manière dont vous allez l'utiliser une fois créé itertools.chain pourrait être votre meilleur pari:

_>>> 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 a pour avantage qu'aucune nouvelle liste ne doit être créée, mais vous pouvez toujours utiliser 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é pose problème, il est très pratique de connaître cette méthode et les autres méthodes du module itertools.

Notez que cet exemple utilise 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.

150
Scott Griffiths

concatenated_list = list_1 + list_2

110
Johan Kotlinski

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

>>> 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'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 chaînes:

>>> 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]
94
Thomas Ahle

vous pouvez toujours créer une nouvelle liste résultant de l'ajout de deux listes.

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

Les listes étant des séquences mutables, il est donc logique de modifier les listes originales en les étendant ou en les ajoutant.

44
pyfunc

Et si vous avez plus de deux listes à concaténer:

import operator
list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
reduce(operator.add, [list1, list2, list3])

# or with an existing list
all_lists = [list1, list2, list3]
reduce(operator.add, all_lists)

En fait, cela ne vous fait pas gagner du temps (des listes intermédiaires sont toujours créées), mais Nice si vous avez un nombre variable de listes à aplatir, par exemple, *args.

20
Jake Biesinger

Juste pour que tu saches:

Lorsque vous écrivez list1 + list2, vous appelez la méthode __add__ de list1, qui renvoie une nouvelle liste. De cette façon, vous pouvez également traiter avec myobject + list1 en ajoutant la méthode __add__ à votre classe personnelle.

15
Ant