web-dev-qa-db-fra.com

Python: comprendre la différence entre append et extend

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)
7
AlanH

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]
17
chepner

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.

5
Reut Sharabani

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]
5
Sam Bruns

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']
2
Haresh Shyara

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)
1
Marek