Quelle est la différence entre les opérations d'ajout et de mise à jour en python si je veux juste ajouter une valeur unique à l'ensemble.
a = set()
a.update([1]) #works
a.add(1) #works
a.update([1,2])#works
a.add([1,2])#fails
Quelqu'un peut-il expliquer pourquoi est-ce ainsi.
set.add
ajoute un élément individuel à l'ensemble. Alors,
>>> a = set()
>>> a.add(1)
>>> a
set([1])
fonctionne, mais il ne peut pas fonctionner avec un itérable, à moins que ce soit hashable. C'est la raison pour laquelle a.add([1, 2])
échoue.
>>> a.add([1, 2])
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'
Ici, [1, 2]
est traité en tant qu'élément ajouté à l'ensemble et, comme le dit le message d'erreur, une liste ne peut pas être hachée mais tous les éléments d'un ensemble doivent être hashables. Citer la documentation ,
Renvoie un nouvel objet
set
oufrozenset
dont les éléments sont extraits de iterable. Les éléments d'un ensemble doivent être lavables .
Dans le cas de set.update
, vous pouvez lui transmettre plusieurs éléments itérables. Tous les éléments itérables seront itérés et les éléments individuels de l'ensemble seront inclus. Rappelez-vous: _ Il ne peut accepter que des iterables. C'est pourquoi vous obtenez une erreur lorsque vous essayez de le mettre à jour avec 1
>>> a.update(1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'int' object is not iterable
Toutefois, les éléments suivants fonctionneraient, car la liste [1]
est itérée et les éléments de la liste sont ajoutés à l'ensemble.
>>> a.update([1])
>>> a
set([1])
set.update
est fondamentalement un équivalent de l'opération d'union d'ensemble sur place. Considérons les cas suivants
>>> set([1, 2]) | set([3, 4]) | set([1, 3])
set([1, 2, 3, 4])
>>> set([1, 2]) | set(range(3, 5)) | set(i for i in range(1, 5) if i % 2 == 1)
set([1, 2, 3, 4])
Ici, nous convertissons explicitement tous les itérables en ensembles, puis nous trouvons l'union. Il existe plusieurs ensembles et unions intermédiaires. Dans ce cas, set.update
est une fonction d'assistance utile. Puisqu'il accepte n'importe quelle valeur, vous pouvez simplement faire
>>> a.update([1, 2], range(3, 5), (i for i in range(1, 5) if i % 2 == 1))
>>> a
set([1, 2, 3, 4])
add
est plus rapide pour un seul élément, car c'est précisément dans ce but que vous ajoutez un seul élément:
In [5]: timeit a.update([1])
10000000 loops, best of 3: 191 ns per loop
In [6]: timeit a.add(1)
10000000 loops, best of 3: 69.9 ns per loop
update
s'attend à un élément iterable ou iterables; si vous avez un seul élément hashable à ajouter, utilisez add
si vous avez un élément iterable ou iterables à ajouter, utilisez update
.
s.add (x) ajoute un élément x pour définir s
s.update (t) s | = t renvoie un ensemble s avec des éléments ajoutés à partir de t
add
ajoute un élément, update
"ajoute" une autre itérative set
, list
ou Tuple
, par exemple
In [2]: my_set = {1,2,3}
In [3]: my_set.add(5)
In [4]: my_set
Out[4]: set([1, 2, 3, 5])
In [5]: my_set.update({6,7})
In [6]: my_set
Out[6]: set([1, 2, 3, 5, 6, 7])
.add()
est destiné à une seule element
, alors que .update()
est destiné à l'introduction d'autres ensembles.
De l'aide ():
add(...)
Add an element to a set.
This has no effect if the element is already present.
update(...)
Update a set with the union of itself and others.
add
accepte uniquement un type hashable. Une liste n'est pas hashable.
a.update(1)
dans votre code ne fonctionnera pas. add
accepte un élément et le met dans l'ensemble s'il n'y est pas déjà mais update
prend un élément itérable et en fait une union avec l'ensemble. C'est un peu comme append
et extend
pour les listes.
Je suppose que personne n'a parlé de la bonne ressource de Hackerrank. Je voudrais coller comment Hackerrank mentionne la différence entre update et add for set en python.
Les ensembles sont un sac non ordonné de valeurs uniques. Un seul ensemble contient les valeurs de tout type de données immuable.
SET DE CRÉATION
myset = {1, 2} # Directly assigning values to a set
myset = set() # Initializing a set
myset = set(['a', 'b']) # Creating a set from a list
print(myset) ===> {'a', 'b'}
MODIFYING SET - add () et update ()
myset.add('c')
myset ===>{'a', 'c', 'b'}
myset.add('a') # As 'a' already exists in the set, nothing happens
myset.add((5, 4))
print(myset) ===> {'a', 'c', 'b', (5, 4)}
myset.update([1, 2, 3, 4]) # update() only works for iterable objects
print(myset) ===> {'a', 1, 'c', 'b', 4, 2, (5, 4), 3}
myset.update({1, 7, 8})
print(myset) ===>{'a', 1, 'c', 'b', 4, 7, 8, 2, (5, 4), 3}
myset.update({1, 6}, [5, 13])
print(myset) ===> {'a', 1, 'c', 'b', 4, 5, 6, 7, 8, 2, (5, 4), 13, 3}
J'espère que ça aide. Pour plus de détails sur Hackerrank, voici le lien.
la méthode add ajoute directement des éléments à l'ensemble tandis que la méthode update convertit le premier argument en ensemble, puis ajoute la liste est hashable, nous ne pouvons donc pas ajouter de liste hashable à un ensemble non fastidieux.