web-dev-qa-db-ja.com

どちらかを変更せずにPythonで2つのリストを連結するにはどうすればよいですか。

Pythonでは、2つのリストを連結する唯一の方法は、最初のリストを変更するlist.extendです。引数を変更せずに結果を返す連結関数はありますか?

599
Ryan Thompson

はい:list1+list2。これはlist1list2の連結である新しいリストを与えます。

1028
NPE

それが作成されたらそれをどのように使うつもりであるかによりますが itertools.chain があなたの最善の策かもしれません:

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

これは結合リストの項目のジェネレータを作成します。これは新しいリストを作成する必要がないという利点がありますが、2つのリストを連結したかのようにcを使用することができます。

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

もしあなたのリストが大きく効率が問題になるのであればitertoolsモジュールからのこれと他の方法は知るのにとても便利です。

この例ではcの項目を使い果たしているので、再利用する前に再初期化する必要があります。もちろん、list(c)を使用して全リストを作成することもできますが、それによってメモリ内に新しいリストが作成されます。

146
Scott Griffiths

concatenated_list = list_1 + list_2

108
Johan Kotlinski

sum引数を与えるならば、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]

これは+演算子を持つものすべてに対して一般的に機能します。

>>> 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

文字列の注目すべき例外はありますが:

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

2つのリストを追加した結果である新しいリストをいつでも作成できます。

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

リストは変更可能なシーケンスなので、拡張や追加によって元のリストを修正するのは理にかなっていると思います。

44
pyfunc

また、連結するリストが3つ以上ある場合は、次のようにします。

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)

実際には時間を節約することはできません(中間リストはまだ作成されています)が、フラット化するリストの数が可変であれば、*argsのようにいいでしょう。

20
Jake Biesinger

あなたに知らせるためだけに:

list1 + list2を書くとき、あなたは新しいリストを返す__add__list1メソッドを呼んでいます。このように、myobject + list1メソッドをあなたの個人クラスに追加することで__add__を扱うこともできます。

15
Ant