Testado no interpretador 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
Eu acho que não posso adicionar a lista ao conjunto porque não há como o Python saber se eu adicionei a mesma lista duas vezes. Existe uma solução alternativa?
EDIT: Eu quero adicionar a lista em si, não seus elementos.
Respostas:
Você não pode adicionar uma lista a um conjunto porque as listas são mutáveis, o que significa que você pode alterar o conteúdo da lista depois de adicioná-lo ao conjunto.
No entanto, você pode adicionar tuplas ao conjunto, porque não é possível alterar o conteúdo de uma tupla:
Edit : alguma explicação: A documentação define a
set
como uma coleção não ordenada de objetos hash distintos. Os objetos devem ser laváveis para que a localização, adição e remoção de elementos possa ser feita mais rapidamente do que observar cada elemento individual toda vez que você executar essas operações. Os algoritmos específicos usados são explicados no artigo da Wikipedia . Os algoritmos de hash do Pythons são explicados no effbot.org e o pythons__hash__
funciona na referência do python .Alguns fatos:
list
: use emtuple
vez dissoset
: use emfrozenset
vez dissodict
: não tem contrapartida oficial, mas existem algumas receitasfonte
collections.namedtuple
pode ser considerado equivalente "oficial" dodict
.Use
set.update()
ou|=
editar: se você deseja adicionar a lista em si e não seus membros, infelizmente deve usar uma tupla. Os membros do conjunto devem ser laváveis .
fonte
|
operador implementa a operação de união do conjunto . Tanto o|=
operador quanto oset.update()
método aplicam essa operação no local e são efetivamente sinônimos. Portanto,set_a |= set_b
poderia ser considerado açúcar sintático para ambosset_a.update(set_b)
eset_a = set_a | set_b
(exceto que, no último caso, o mesmoset_a
objeto é reutilizado em vez de reatribuído).</ahem>
Para adicionar os elementos de uma lista a um conjunto , use
update
De https://docs.python.org/2/library/sets.html
Por exemplo
Se você deseja adicionar a lista inteira como um único elemento ao conjunto, não pode, porque as listas não são hasháveis. Você poderia adicionar uma tupla, por exemplo
s.add(tuple(l))
. Consulte também TypeError: unhashable type: 'list' ao usar a função de conjunto embutida para obter mais informações sobre isso.fonte
Espero que isso ajude:
fonte
Por favor, observe a função
set.update()
. A documentação diz:fonte
Os objetos da lista são removíveis . você pode querer transformá-los em tuplas.
fonte
Os conjuntos não podem ter elementos / membros mutáveis (alteráveis). Uma lista, sendo mutável, não pode ser membro de um conjunto.
Como os conjuntos são mutáveis, você não pode ter um conjunto de conjuntos! Você pode ter um conjunto de frozensets.
(O mesmo tipo de "requisito de mutabilidade" se aplica às chaves de um ditado.)
Outras respostas já lhe deram código, espero que isso dê um pouco de insight. Espero que Alex Martelli responda com ainda mais detalhes.
fonte
Você deseja adicionar uma tupla, não uma lista:
Se você tiver uma lista, poderá converter para a tupla, como mostrado acima. Uma tupla é imutável, portanto pode ser adicionada ao conjunto.
fonte
Descobri que precisava fazer algo semelhante hoje. O algoritmo sabia quando estava criando uma nova lista que precisava ser adicionada ao conjunto, mas não quando teria terminado de operar na lista.
De qualquer forma, o comportamento que eu queria era usar
id
e não usarhash
. Como tal, encontrei emmydict[id(mylist)] = mylist
vez demyset.add(mylist)
oferecer o comportamento que queria.fonte
Você desejará usar tuplas, que podem ser lavadas (você não pode misturar um objeto mutável como uma lista).
fonte
Aqui está como eu costumo fazer isso:
fonte
Isso deve fazer:
fonte