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?
Oui: list1+list2
. Cela donne une nouvelle liste qui est la concaténation de list1
et list2
.
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.
concatenated_list = list_1 + list_2
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]
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.
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
.
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.