Python: la compréhension de la différence entre l'ajout et la prolonger
Le code ci-dessous ne fonctionnera pas dans son état actuel. Cependant, si je change sum_vec.extend( vec1[i] + vec2[i] )
à sum_vec.append( vec1[i] + vec2[i] )
il fonctionne très bien. Je comprends la base de différents entre l'ajout et la prolonger, mais je ne comprends pas pourquoi le code ne fonctionne pas si j'utilise l'extension.
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)
Avez-vous regardé la différence entre les versions de
sum_vec
après les deux opérations? Exactement ce que fait "ne fonctionne pas" moyenne des erreurs? Inattendu sorties?
OriginalL'auteur AlanH | 2015-04-08
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont souligné,
extend
prend un objet iterable (comme une liste, tuple ou une chaîne), et ajoute chaque élément de l'objet iterable à la liste un à un, tandis queappend
ajoute son argument à la fin de la liste comme un seul élément. La chose à noter est queextend
est plus efficace version de l'appel deappend
plusieurs fois.append
peut prendre un objet iterable comme argument, mais il le traite comme un objet unique:a.extend(str)
?Il n'a pas la traiter comme une liste; il la traite comme une objet iterable, qui est quelque chose que vous pouvez parcourir. Vous itérer sur une chaîne à l'obtention de chacun de ses personnages un par un. Vous itérer sur une liste ou un tuple par l'obtention de ses éléments un par un. Vous itérer sur un dict par l'obtention de ses touches une par une.
extend
ne se soucie pas de ce son argument est, aussi longtemps qu'il peut être itéré.OriginalL'auteur chepner
Vous pouvez lire la documentation sur liste:
list.append
ajoute un seul élément à la fin de votre liste:list.extend
utilise un objet iterable et ajoute, tous les éléments à la fin de votre liste:Vous devez utiliser:
De cette façon, un objet iterable avec un seul élément (
vec1[i] + vec2[i]
) est passé. Maislist.append
est plus adapté lorsque vous êtes toujours à l'ajout d'un seul élément.OriginalL'auteur Reut Sharabani
Lorsque vous exécutez votre code, vous obtenez une exception comme ceci:
En d'autres termes, la
étendre
méthode attend un objet iterable comme argument.Cependant méthode append devient un élément comme argument.
Voici un petit exemple de la différence entre, d'étendre et d'ajouter:
De sortie:
OriginalL'auteur Sam Bruns
La méthode append ajoute son paramètre comme un seul élément de la liste, tandis que d'étendre obtient une liste et ajoute son contenu.
OriginalL'auteur Haresh Shyara
étendre besoin d'un itérable en tant que paramètre
si vous souhaitez étendre la liste par un seul élément que vous avez besoin de s'habiller est dans une liste
OriginalL'auteur Marek