Probado en el intérprete 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
Creo que no puedo agregar la lista al conjunto porque no hay forma de que Python pueda saber si he agregado la misma lista dos veces. ¿Hay alguna solución?
EDITAR: Quiero agregar la lista en sí, no sus elementos.
Respuestas:
No puede agregar una lista a un conjunto porque las listas son mutables, lo que significa que puede cambiar el contenido de la lista después de agregarla al conjunto.
Sin embargo, puede agregar tuplas al conjunto, porque no puede cambiar el contenido de una tupla:
Editar : alguna explicación: La documentación define a
set
como una colección desordenada de distintos objetos que se pueden compartir. Los objetos tienen que ser intercambiables para poder encontrar, agregar y eliminar elementos más rápido que mirar cada elemento individual cada vez que realice estas operaciones. Los algoritmos específicos utilizados se explican en el artículo de Wikipedia . Los algoritmos de hash de Pythons se explican en effbot.org y la__hash__
función de pythons en la referencia de python .Algunos hechos:
list
: utilizartuple
en su lugarset
: utilizarfrozenset
en su lugardict
: no tiene contraparte oficial, pero hay algunas recetasfuente
collections.namedtuple
podría considerarse contraparte "oficial" de ladict
.Use
set.update()
o|=
editar: si desea agregar la lista en sí y no sus miembros, desafortunadamente debe usar una tupla. Los miembros del conjunto deben ser hashable .
fuente
|
operador implementa la operación de unión de conjuntos . Tanto el|=
operador como elset.update()
método aplican esa operación en el lugar y son efectivamente sinónimos. Por lo tanto,set_a |= set_b
podría considerarse azúcar sintáctico para ambosset_a.update(set_b)
yset_a = set_a | set_b
(excepto que en el último caso, el mismoset_a
objeto se reutiliza en lugar de reasignarse).</ahem>
Para agregar los elementos de una lista a un conjunto , use
update
Desde https://docs.python.org/2/library/sets.html
P.ej
Si, en cambio, desea agregar la lista completa como un elemento único al conjunto, no puede hacerlo porque las listas no se pueden compartir. En su lugar, podría agregar una tupla, por ejemplo
s.add(tuple(l))
. Consulte también TypeError: tipo no compartible: 'lista' cuando se utiliza la función de conjunto incorporada para obtener más información al respecto.fuente
Esperemos que esto ayude:
fuente
Tenga en cuenta la función
set.update()
. La documentación dice:fuente
Los objetos de la lista no son compartibles . Sin embargo, es posible que desee convertirlos en tuplas.
fuente
Los conjuntos no pueden tener elementos / miembros mutables (modificables). Una lista, al ser mutable, no puede ser miembro de un conjunto.
Como los conjuntos son mutables, ¡no puede tener un conjunto de conjuntos! Sin embargo, puedes tener un conjunto de congelados.
(El mismo tipo de "requisito de mutabilidad" se aplica a las claves de un dict.)
Otras respuestas ya le han dado el código, espero que esto le dé un poco de información. Espero que Alex Martelli responda con aún más detalles.
fuente
Desea agregar una tupla, no una lista:
Si tiene una lista, puede convertirla a la tupla, como se muestra arriba. Una tupla es inmutable, por lo que se puede agregar al conjunto.
fuente
Descubrí que necesitaba hacer algo similar hoy. El algoritmo sabía cuándo estaba creando una nueva lista que debía agregarse al conjunto, pero no cuándo habría terminado de funcionar en la lista.
De todos modos, el comportamiento que quería era usarlo en
id
lugar de hacerlohash
. Como tal, encontré enmydict[id(mylist)] = mylist
lugar demyset.add(mylist)
ofrecer el comportamiento que quería.fuente
Querrás usar tuplas, que son hash (no puedes hacer un hash con un objeto mutable como una lista).
fuente
Así es como lo hago habitualmente:
fuente
Esto debería hacer:
fuente