Testé sur l'interpréteur Python 2.6:
>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
a.add(l)
TypeError: list objects are unhashable
Je pense que je ne peux pas ajouter la liste à l'ensemble car il n'y a aucun moyen pour Python de savoir si j'ai ajouté deux fois la même liste. Y at-il un travail autour?
EDIT: Je veux ajouter la liste elle-même, pas ses éléments.
Réponses:
Vous ne pouvez pas ajouter une liste à un ensemble car les listes sont modifiables, ce qui signifie que vous pouvez modifier le contenu de la liste après l'avoir ajoutée à l'ensemble.
Vous pouvez cependant ajouter des tuples à l'ensemble, car vous ne pouvez pas modifier le contenu d'un tuple:
Edit : quelques explications: La documentation définit un
set
comme une collection non ordonnée d'objets lavables distincts. Les objets doivent être lavables afin que la recherche, l'ajout et la suppression d'éléments puissent être effectués plus rapidement que la consultation de chaque élément individuel à chaque fois que vous effectuez ces opérations. Les algorithmes spécifiques utilisés sont expliqués dans l'article Wikipedia . Les algorithmes de hachage Pythons sont expliqués sur effbot.org et la__hash__
fonction pythons dans la référence python .Quelques faits:
list
: utiliser à latuple
placeset
: utiliser à lafrozenset
placedict
: n'a pas d'homologue officiel, mais il existe des recettesla source
collections.namedtuple
pourrait être considéré comme une contrepartie "officielle" de ladict
.Utilisez
set.update()
ou|=
modifier: Si vous souhaitez ajouter la liste elle-même et non ses membres, vous devez malheureusement utiliser un tuple. Les membres du set doivent être lavables .
la source
|
opérateur implémente l' opération d'union d'ensemble . L'|=
opérateur et laset.update()
méthode appliquent cette opération sur place et sont effectivement synonymes. Donc,set_a |= set_b
pourrait être considéré comme du sucre syntaxique pour les deuxset_a.update(set_b)
etset_a = set_a | set_b
(sauf que dans ce dernier cas, le mêmeset_a
objet est réutilisé plutôt que réaffecté).</ahem>
Pour ajouter les éléments d'une liste à un ensemble , utilisez
update
Depuis https://docs.python.org/2/library/sets.html
Par exemple
Si vous souhaitez plutôt ajouter la liste entière en tant qu'élément unique à l'ensemble, vous ne pouvez pas car les listes ne sont pas hachables. Vous pouvez à la place ajouter un tuple, par exemple
s.add(tuple(l))
. Voir aussi TypeError: unhashable type: 'list' lors de l'utilisation de la fonction set intégrée pour plus d'informations à ce sujet.la source
Espérons que cela aide:
la source
Veuillez noter la fonction
set.update()
. La documentation dit:la source
les objets de liste ne sont pas partageables . vous voudrez peut-être les transformer en tuples.
la source
Les ensembles ne peuvent pas avoir d'éléments / membres modifiables (modifiables). Une liste, étant modifiable, ne peut pas être membre d'un ensemble.
Comme les ensembles sont mutables, vous ne pouvez pas avoir un ensemble d'ensembles! Vous pouvez cependant avoir un ensemble de frozensets.
(Le même type de "condition de mutabilité" s'applique aux clés d'un dict.)
D'autres réponses vous ont déjà donné du code, j'espère que cela donne un peu de perspicacité. J'espère qu'Alex Martelli répondra avec encore plus de détails.
la source
Vous souhaitez ajouter un tuple, pas une liste:
Si vous avez une liste, vous pouvez convertir en tuple, comme indiqué ci-dessus. Un tuple est immuable, il peut donc être ajouté à l'ensemble.
la source
J'ai trouvé que je devais faire quelque chose de similaire aujourd'hui. L'algorithme savait quand il créait une nouvelle liste qui devait être ajoutée à l'ensemble, mais pas quand il aurait fini d'opérer sur la liste.
Quoi qu'il en soit, le comportement que je voulais était
id
plutôt que d'utiliserhash
. En tant que tel, j'ai trouvémydict[id(mylist)] = mylist
au lieu d'myset.add(mylist)
offrir le comportement que je voulais.la source
Vous voudrez utiliser des tuples, qui sont lavables (vous ne pouvez pas hacher un objet mutable comme une liste).
la source
Voici comment je le fais habituellement:
la source
Cela devrait faire:
la source