web-dev-qa-db-ja.com

Python:追加と拡張の違いを理解する

以下のコードは、現在の状態では実行されません。ただし、sum_vec.extend( vec1[i] + vec2[i] )sum_vec.append( vec1[i] + vec2[i] )に変更すると、問題なく動作します。追加と拡張の基本的な違いは理解していますが、拡張を使用するとコードが機能しない理由がわかりません。

def addVectors(v1, v2):

    vec1 = list(v1)
    vec2 = list(v2)
    sum_vec = []
    vec1_len = len(vec1)
    vec2_len = len(vec2)
    min_len = min( vec1_len, vec2_len )

    # adding up elements pointwise
    if vec1_len == 0 and vec2_len == 0:
        return sum_vec
    else:
        for i in xrange(0, min_len):
            sum_vec.extend( vec1[i] + vec2[i] )

    # in case one vector is longer than the other
    if vec1_len != vec2_len:
        if vec1_len > vec2_len:
            sum_vec.extend( vec1[min_len : vec1_len] )
        else:
            sum_vec.extend( vec2[min_len : vec2_len] ) 
    print sum_vec
    return sum_vec

v1 = [1,3,5]
v2 = [2,4,6,8,10]
addVectors(v1,v2)
7
AlanH

他の人が指摘しているように、extendはイテラブル(リスト、タプル、文字列など)を取り、イテラブルの各要素を一度に1つずつリストに追加し、appendは単一の項目としてリストの最後に引数。注意すべき重要な点は、extendappendを複数回呼び出すより効率的なバージョンであるということです。

a = [1,2]
b = [1,2]

a.extend([3, 4])
for x in [3, 4]:
    b.append(x)

assert a == b

appendは引数としてiterableを取ることができますが、それを単一のオブジェクトとして扱います。

a = [1,2]
a.append([3,4])
assert a == [1, 2, [3, 4]]  # not [1, 2, 3, 4]
17
chepner

list のドキュメントを読むことができます:

list.appendリストの最後に1つのアイテムを追加します:

リストの最後にアイテムを追加します。 a [len(a):] = [x]と同等です。

list.extendは反復可能オブジェクトを使用し、そのすべての要素をリストの最後に追加します。

指定されたリストのすべての項目を追加して、リストを拡張します。 a [len(a):] = Lと同等です。

使用する必要があります:

sum_vec.extend([vec1[i] + vec2[i]]) # note that a list is created

そうすれば、単一のアイテムで反復可能です(vec1[i] + vec2[i]) 合格。だが list.appendは、常に1つのアイテムを追加する場合に適しています。

5
Reut Sharabani

コードを実行すると、次のような例外が発生します。

Traceback (most recent call last):
  File ".../stack.py", line 28, in <module>
    addVectors(v1,v2)
  File ".../stack.py", line 15, in addVectors
    sum_vec.extend( vec1[i] + vec2[i] )
TypeError: 'int' object is not iterable

言い換えると、 extend メソッドは引数としてiterableを期待します。ただし、appendメソッドは引数として項目を取得します。

次に、extendとappendの違いの小さな例を示します。

l = [1, 2, 3, 4]
m = [10, 11]
r = list(m)
m.append(l)
r.extend(l)

print(m)
print(r)

出力:

[10, 11, [1, 2, 3, 4]]
[10, 11, 1, 2, 3, 4]
5
Sam Bruns

メソッドappendはそのパラメーターを単一の要素としてリストに追加し、extendはリストを取得してそのコンテンツを追加します。

letters = ['a', 'b']

letters.extend(['c', 'd'])
print(letters)    # ['a', 'b', 'c', 'd']

letters.append(['e', 'f'])
print(letters)    # ['a', 'b', 'c', 'd', ['e', 'f']]

names = ['Foo', 'Bar']
names.append('Baz')
print(names)   # ['Foo', 'Bar', 'Baz']

names.extend('Moo')
print(names)   # ['Foo', 'Bar', 'Baz', 'M', 'o', 'o']
2
Haresh Shyara

ドレスアップする必要のある単一の要素でリストを拡張する場合は、extendにパラメータとして反復可能が必要です。

a = []
b = 1

a.extend([b])
a.append(b)
1
Marek