簡體   English   中英

Python:了解附加和擴展之間的區別

[英]Python: understanding difference between append and extend

下面的代碼不會在其當前狀態下運行。 但是,如果我將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)

正如其他人指出的那樣, extend接受一個可迭代的對象(例如列表,元組或字符串),並且一次將可迭代對象的每個元素一次添加到列表中,而append將其參數作為一個單獨的元素添加到列表的末尾項目。 需要注意的關鍵是, extend是多次調用append的更有效的版本。

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]

您可以閱讀清單上的文檔:

list.append將單個項目添加到列表的末尾:

在列表末尾添加一個項目; 等效於a [len(a):] = [x]。

list.extend使用一個iterable並將其所有元素添加到列表的末尾:

通過添加給定列表中的所有項目來擴展列表; 等效於a [len(a):] =L。

您需要使用:

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

這樣,通過單個項目( vec1[i] + vec2[i] )進行迭代。 但是,當您始終添加單個項目時, list.append更適合。

當您運行代碼時,會出現如下異常:

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方法需要一個可迭代的參數。 但是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]

方法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']

如果您想將列表擴展一個需要修飾的元素,則擴展需要一個可迭代的參數作為參數

a = []
b = 1

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM