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


Cette question a déjà une réponse ici:

En Python, la seule façon de concaténer deux listes est list.extend, qui modifie la première liste. Y at-il une fonction de concaténation qui renvoie son résultat sans modifier ses arguments?


506
2017-12-03 09:16


origine


Réponses:


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


871
2017-12-03 09:17



En fonction de comment vous allez l'utiliser une fois qu'il est 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 présente l'avantage qu'aucune nouvelle liste ne doit être créée, mais vous pouvez toujours utiliser c comme si c'était 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 problème, cette méthode et d’autres méthodes du itertools module sont très pratiques à connaître.

Notez que cet exemple utilise les éléments dans c, vous devrez 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.


132
2017-12-03 10:41



Que diriez-vous list1 + list2?


77
2017-12-03 09:18



Vous pouvez aussi utiliser sumsi vous lui donnez 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 le + 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]

74
2018-02-12 13:06



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 sont des séquences mutables, donc je suppose qu'il est logique de modifier les listes originales par extension ou append.


40
2017-12-03 09:18



Juste pour que tu saches:

Quand vous écrivez list1 + list2, vous appelez le __add__ méthode de list1, qui renvoie une nouvelle liste. de cette façon, vous pouvez également faire face à myobject + list1 en ajoutant le __add__ méthode à votre classe personnelle.


15
2017-12-03 12:50



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)

Il ne vous permet pas vraiment de gagner du temps (les listes intermédiaires sont toujours créées) mais c'est bien si vous avez un nombre variable de listes à aplatir, par exemple, *args.


15
2017-08-27 08:41