Pythonでは、2つのリストを連結する唯一の方法は、最初のリストを変更するlist.extend
です。引数を変更せずに結果を返す連結関数はありますか?
はい:list1+list2
。これはlist1
とlist2
の連結である新しいリストを与えます。
それが作成されたらそれをどのように使うつもりであるかによりますが 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)
を使用して全リストを作成することもできますが、それによってメモリ内に新しいリストが作成されます。
concatenated_list = list_1 + list_2
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]
2つのリストを追加した結果である新しいリストをいつでも作成できます。
>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]
リストは変更可能なシーケンスなので、拡張や追加によって元のリストを修正するのは理にかなっていると思います。
また、連結するリストが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
のようにいいでしょう。
あなたに知らせるためだけに:
list1 + list2
を書くとき、あなたは新しいリストを返す__add__
のlist1
メソッドを呼んでいます。このように、myobject + list1
メソッドをあなたの個人クラスに追加することで__add__
を扱うこともできます。