695

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

4

7 に答える 7

1146

はい: list1 + list2. これにより、 と を連結した新しいリストが得られlist1ますlist2

于 2010-12-03T09:17:48.827 に答える
170

最も簡単な方法は+、リストの連結を返す演算子を使用することです。

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)して完全なリストを作成することもできますが、それはメモリ内に新しいリストを作成します。

于 2010-12-03T10:41:59.093 に答える
116

concatenated_list = list_1 + list_2

于 2010-12-03T09:18:15.787 に答える
101

引数を指定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]
于 2014-02-12T13:06:15.157 に答える
45

2 つのリストを追加した結果、常に新しいリストを作成できます。

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

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

于 2010-12-03T09:18:16.213 に答える
24

連結するリストが 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.

于 2013-08-27T08:41:42.023 に答える
16

お知らせするだけです:

を記述するときは、新しいリストを返すのメソッドをlist1 + list2呼び出しています。このようにして、メソッドを個人クラスに追加することで対処することもできます。__add__list1myobject + list1__add__

于 2010-12-03T12:50:22.360 に答える