Le code ci-dessous ne fonctionnera pas dans son état actuel. Cependant, si je change sum_vec.extend( vec1[i] + vec2[i] )
en sum_vec.append( vec1[i] + vec2[i] )
, cela fonctionne parfaitement. Je comprends la différence fondamentale entre append et extend, mais je ne comprends pas pourquoi le code ne fonctionne pas si j'utilise extend.
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)
Comme d'autres l'ont fait remarquer, extend
prend un itérable (tel qu'une liste, un nuplet ou une chaîne) et ajoute chaque élément de l'iterable à la liste un à la fois, tandis que append
ajoute son argument à la fin de la liste sous la forme d'un seul élément. article. L'essentiel à noter est que extend
est une version plus efficace de l'appel de append
à plusieurs reprises.
a = [1,2]
b = [1,2]
a.extend([3, 4])
for x in [3, 4]:
b.append(x)
assert a == b
append
peut prendre un paramètre itérable, mais le traite comme un objet unique:
a = [1,2]
a.append([3,4])
assert a == [1, 2, [3, 4]] # not [1, 2, 3, 4]
Vous pouvez lire la documentation sur list :
list.append
ajoute un seul élément à la fin de votre liste:
Ajouter un élément à la fin de la liste; équivalent à un [len (a):] = [x].
list.extend
utilise un itérable et ajoute tous ses éléments à la fin de votre liste:
Étendre la liste en ajoutant tous les éléments de la liste donnée; équivalent à un [len (a):] = L.
Vous devez utiliser:
sum_vec.extend([vec1[i] + vec2[i]]) # note that a list is created
De cette façon, un itératif avec un seul élément (vec1[i] + vec2[i]
) est passé. Mais list.append
est plus approprié lorsque vous ajoutez toujours un seul élément.
Lorsque vous exécutez votre code, vous obtenez une exception comme celle-ci:
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
En d’autres termes, la méthode extend
attend un argument itérable. Cependant, la méthode append obtient un élément en tant qu’argument.
Voici un petit exemple de la différence entre extend et append:
l = [1, 2, 3, 4]
m = [10, 11]
r = list(m)
m.append(l)
r.extend(l)
print(m)
print(r)
Sortie:
[10, 11, [1, 2, 3, 4]]
[10, 11, 1, 2, 3, 4]
La méthode append ajoute son paramètre sous la forme d'un élément unique à la liste, tandis que extend obtient une liste et ajoute son contenu.
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 nécessite un paramètre itératif en tant que paramètre si vous souhaitez étendre la liste d'un seul élément dont vous avez besoin pour vous habiller dans une liste
a = []
b = 1
a.extend([b])
a.append(b)