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)
您可以阅读 list 上的文档:
list.append
将单个项目添加到列表末尾:
Add an item to the end of the list; equivalent to a[len(a):] = [x].
list.extend
使用可迭代对象并将其所有元素添加到列表的末尾:
Extend the list by appending all the items in the given list; equivalent to 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 方法获取一个项目作为参数。
下面是扩展和追加之间区别的一个小例子:
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]
extend需要一个iterable作为参数
如果你想通过单个元素扩展列表,你需要在列表中穿衣
a = []
b = 1
a.extend([b])
a.append(b)
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']
正如其他人指出的那样,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
可以接受一个可迭代对象作为它的参数,但它把它当作一个单独的对象:
a = [1,2]
a.append([3,4])
assert a == [1, 2, [3, 4]] # not [1, 2, 3, 4]
下面的代码不会 运行 在其当前状态。但是,如果我将 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)
您可以阅读 list 上的文档:
list.append
将单个项目添加到列表末尾:
Add an item to the end of the list; equivalent to a[len(a):] = [x].
list.extend
使用可迭代对象并将其所有元素添加到列表的末尾:
Extend the list by appending all the items in the given list; equivalent to 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 方法获取一个项目作为参数。
下面是扩展和追加之间区别的一个小例子:
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]
extend需要一个iterable作为参数 如果你想通过单个元素扩展列表,你需要在列表中穿衣
a = []
b = 1
a.extend([b])
a.append(b)
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']
正如其他人指出的那样,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
可以接受一个可迭代对象作为它的参数,但它把它当作一个单独的对象:
a = [1,2]
a.append([3,4])
assert a == [1, 2, [3, 4]] # not [1, 2, 3, 4]