Pythonのリストメソッドappendとextendの違いは何ですか?

2008年10月31日に質問されました。  ·  閲覧回数 3M回  ·  ソース

Claudiu picture
2008年10月31日

リストメソッドappend()extend()の違いは何ですか?

回答

kender picture
2008年10月31日
5363

append :最後にオブジェクトを追加します。

x = [1, 2, 3]
x.append([4, 5])
print (x)

あなたに与える: [1, 2, 3, [4, 5]]


extend :iterableの要素を追加してリストを拡張します。

x = [1, 2, 3]
x.extend([4, 5])
print (x)

あなたに与える: [1, 2, 3, 4, 5]

Harley Holcombe picture
2008年10月31日
658

appendは要素をリストに追加し、 extendは最初のリストを別のリスト(または別の反復可能、必ずしもリストではない)と連結します。

>>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> li
['a', 'b', 'mpilgrim', 'z', 'example']

>>> li.append("new")
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new']

>>> li.append(["new", 2])
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new', ['new', 2]]

>>> li.insert(2, "new")
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', ['new', 2]]

>>> li.extend(["two", "elements"])
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', ['new', 2], 'two', 'elements']
Aaron Hall picture
2015年01月24日
516

リストメソッドの追加と拡張の違いは何ですか?

  • appendは、引数を単一の要素としてリストの最後に追加します。 リスト自体の長さが1つ増えます。
  • extendは引数を繰り返し処理して、各要素をリストに追加し、リストを拡張します。 リストの長さは、反復可能な引数に多くの要素が含まれていたとしても増加します。

append

list.appendメソッドは、リストの最後にオブジェクトを追加します。

my_list.append(object) 

オブジェクトが何であれ、数字、文字列、別のリスト、またはその他のものであるかどうかにかかわらず、オブジェクトはリストの単一のエントリとしてmy_listの最後に追加されます。

>>> my_list
['foo', 'bar']
>>> my_list.append('baz')
>>> my_list
['foo', 'bar', 'baz']

したがって、リストはオブジェクトであることに注意してください。 リストに別のリストを追加すると、最初のリストはリストの最後にある単一のオブジェクトになります(これは希望どおりでない場合があります)。

>>> another_list = [1, 2, 3]
>>> my_list.append(another_list)
>>> my_list
['foo', 'bar', 'baz', [1, 2, 3]]
                     #^^^^^^^^^--- single item at the end of the list.

extend

list.extendメソッドは、反復可能オブジェクトから要素を追加することによってリストを拡張します。

my_list.extend(iterable)

したがって、extendを使用すると、iterableの各要素がリストに追加されます。 例えば:

>>> my_list
['foo', 'bar']
>>> another_list = [1, 2, 3]
>>> my_list.extend(another_list)
>>> my_list
['foo', 'bar', 1, 2, 3]

文字列は反復可能であることに注意してください。したがって、文字列でリストを拡張する場合は、文字列を反復処理するときに各文字を追加します(これは希望どおりでない場合があります)。

>>> my_list.extend('baz')
>>> my_list
['foo', 'bar', 1, 2, 3, 'b', 'a', 'z']

演算子のオーバーロード、 __add__+ )および__iadd__+=

++=両方の演算子がlistに対して定義されています。 それらは意味的にextendに似ています。

my_list + another_listは、メモリ内に3番目のリストを作成するため、その結果を返すことができますが、2番目の反復可能オブジェクトがリストである必要があります。

my_list += another_listは、リストをインプレースで変更するため(これインプレース演算子であり、これまで見てきたように、リストは可変オブジェクトです)、新しいリストは作成されません。 また、2番目の反復可能オブジェクトは任意の種類の反復可能オブジェクトである可能性があるという点で、拡張のように機能します。

混乱しないでください- my_list = my_list + another_list+=と同等ではありません-my_listに割り当てられた新しいリストを提供します。

時間計算量

Appendには、一定の時間計算量O(1)があります。

Extendには時間計算量O(k)があります。

appendへの複数の呼び出しを繰り返すと、複雑さが増し、extendと同等になります。また、extendの反復はCで実装されているため、反復可能なアイテムから連続するアイテムを追加する場合は、常に高速になります。リスト。

パフォーマンス

appendはextendと同じ結果を達成するために使用できるため、何がよりパフォーマンスが高いのか疑問に思われるかもしれません。 次の関数は同じことをします:

def append(alist, iterable):
    for item in iterable:
        alist.append(item)

def extend(alist, iterable):
    alist.extend(iterable)

それでは、時間を計りましょう。

import timeit

>>> min(timeit.repeat(lambda: append([], "abcdefghijklmnopqrstuvwxyz")))
2.867846965789795
>>> min(timeit.repeat(lambda: extend([], "abcdefghijklmnopqrstuvwxyz")))
0.8060121536254883

タイミングに関するコメントへの対応

コメント投稿者は言った:

完璧な答え、1つの要素だけを追加して比較するタイミングが恋しい

意味的に正しいことをしてください。 反復可能にすべての要素を追加する場合は、 extendます。 要素を1つだけ追加する場合は、 appendます。

では、これが時間内にどのように機能するかを確認するための実験を作成しましょう。

def append_one(a_list, element):
    a_list.append(element)

def extend_one(a_list, element):
    """creating a new list is semantically the most direct
    way to create an iterable to give to extend"""
    a_list.extend([element])

import timeit

そして、extendを使用するだけでイテラブルを作成するのは、(マイナーな)時間の無駄であることがわかります。

>>> min(timeit.repeat(lambda: append_one([], 0)))
0.2082819009956438
>>> min(timeit.repeat(lambda: extend_one([], 0)))
0.2397019260097295

このことから、追加する要素が1つしかない場合、 extendを使用しても何も得られないことがわかります。

また、これらのタイミングはそれほど重要ではありません。 私は物事正しい方法™やっている、Pythonで、意味的に正しいことをやってポイントを作るためにそれらを示しています。

2つの同等の操作でタイミングをテストし、あいまいまたは逆の結果が得られる可能性があると考えられます。 意味的に正しいことをすることに集中してください。

結論

extendは意味的に明確であり、反復可能オブジェクトの各要素をリストに追加する場合はappendよりもはるかに高速に実行できることがわかります。

リストに追加する要素が1つしかない(反復可能ではない)場合は、 appendます。

Greg Hewgill picture
2008年10月31日
125

appendは単一の要素を追加します。 extendは、要素のリストを追加します。

追加するリストを渡すと、1つの要素が追加されることに注意してください。

>>> a = [1, 2, 3]
>>> a.append([4, 5, 6])
>>> a
[1, 2, 3, [4, 5, 6]]
Giovanni G. PY picture
2017年10月18日
72

追加と拡張

enter image description here

追加を使用すると、リストを拡張する単一の要素を追加できます。

>>> a = [1,2]
>>> a.append(3)
>>> a
[1,2,3]

複数の要素を拡張する場合は、1つの要素または要素のリストを1つしか追加できないため、extendを使用する必要があります。

>>> a.append([4,5])
>>> a
>>> [1,2,3,[4,5]]

ネストされたリストを取得するように

代わりにextendを使用すると、このように単一の要素を拡張できます

>>> a = [1,2]
>>> a.extend([3])
>>> a
[1,2,3]

または、別の方法として、appendとは異なり、リストを元のリストにネストせずに、一度に複数の要素を拡張します(これが、extendという名前の理由です)

>>> a.extend([4,5,6])
>>> a
[1,2,3,4,5,6]

両方の方法で1つの要素を追加する

enter image description here

appendとextendはどちらも、リストの最後に1つの要素を追加できますが、appendの方が簡単です。

1つの要素を追加

>>> x = [1,2]
>>> x.append(3)
>>> x
[1,2,3]

1つの要素を拡張する

>>> x = [1,2]
>>> x.extend([3])
>>> x
[1,2,3]

さらに要素を追加すると...結果が異なります

複数の要素にappendを使用する場合は、要素のリストを引数として渡す必要があり、NESTEDリストを取得します。

>>> x = [1,2]
>>> x.append([3,4])
>>> x
[1,2,[3,4]]

代わりに、extendを使用すると、引数としてリストを渡しますが、古い要素にネストされていない新しい要素を含むリストを取得します。

>>> z = [1,2] 
>>> z.extend([3,4])
>>> z
[1,2,3,4]

したがって、要素が多い場合は、extendを使用して、より多くのアイテムを含むリストを取得します。 ただし、リストを追加してもリストに要素は追加されませんが、コードの出力ではっきりとわかるように、ネストされたリストである1つの要素が追加されます。

enter image description here

enter image description here

Erik picture
2012年08月21日
62

次の2つのスニペットは、意味的に同等です。

for item in iterator:
    a_list.append(item)

そして

a_list.extend(iterator)

ループはCで実装されているため、後者の方が高速な場合があります。

CodyChan picture
2013年10月31日
45

append()メソッドは、リストの最後に1つの項目を追加します。

x = [1, 2, 3]
x.append([4, 5])
x.append('abc')
print(x)
# gives you
[1, 2, 3, [4, 5], 'abc']

extend()メソッドは、1つの引数、リストを受け取り、引数の各項目を元のリストに追加します。 (リストはクラスとして実装されます。リストを「作成」することは、実際にはクラスをインスタンス化することです。そのため、リストには、それを操作するメソッドがあります。)

x = [1, 2, 3]
x.extend([4, 5])
x.extend('abc')
print(x)
# gives you
[1, 2, 3, 4, 5, 'a', 'b', 'c']

Dive IntoPythonから。

denfromufa picture
2013年08月26日
37

所定の位置に拡張する代わりに、「+」を使用して拡張を返すことができます。

l1=range(10)

l1+[11]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11]

l2=range(10,1,-1)

l1+l2

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2]

同様に、インプレース動作の+=ですが、 appendおよびextendとはわずかに異なります。 +=appendおよびextendの最大の違いの1つは、関数スコープで使用される場合です。このブログ投稿を参照してください。

Chaitanya picture
2013年05月13日
22

append(object) -オブジェクトをリストに追加して、リストを更新します。

x = [20]
# List passed to the append(object) method is treated as a single object.
x.append([21, 22, 23])
# Hence the resultant list length will be 2
print(x)
--> [20, [21, 22, 23]]

extend(list) -基本的に2つのリストを連結します。

x = [20]
# The parameter passed to extend(list) method is treated as a list.
# Eventually it is two lists being concatenated.
x.extend([21, 22, 23])
# Here the resultant list's length is 4
print(x)
[20, 21, 22, 23]
kiriloff picture
2013年05月13日
20

extend()は、イテレータ引数とともに使用できます。 これが例です。 次のようにして、リストのリストからリストを作成します。

から

list2d = [[1,2,3],[4,5,6], [7], [8,9]]

あなたが欲しい

>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

itertools.chain.from_iterable()を使用してこれを行うことができます。 このメソッドの出力はイテレータです。 その実装は同等です

def from_iterable(iterables):
    # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

例に戻ると、次のことができます

import itertools
list2d = [[1,2,3],[4,5,6], [7], [8,9]]
merged = list(itertools.chain.from_iterable(list2d))

指名手配リストを取得します。

extend()をイテレータ引数と同等に使用する方法は次のとおりです。

merged = []
merged.extend(itertools.chain.from_iterable(list2d))
print(merged)
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]