Python では、2 つのリストを連結する唯一の方法はlist.extend
、最初のリストを変更する です。引数を変更せずに結果を返す連結関数はありますか?
7 に答える
はい: list1 + list2
. これにより、 と を連結した新しいリストが得られlist1
ますlist2
。
最も簡単な方法は+
、リストの連結を返す演算子を使用することです。
concat = first_list + second_list
この方法の欠点の 1 つは、2 倍のメモリが使用されることです。非常に大きなリストの場合、作成後の使用方法によっては、次の方法がitertools.chain
最善の策となる場合があります。
>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)
これにより、結合されたリスト内のアイテムのジェネレーターが作成されます。これには、新しいリストを作成する必要がないという利点がありますがc
、2 つのリストの連結であるかのように使用できます。
>>> 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]
リストは変更可能なシーケンスなので、元のリストを拡張または追加して変更することは理にかなっていると思います。
連結するリストが 2 つ以上ある場合は、次のようにします。
import operator
from functools import reduce # For Python 3
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__