Python: Add list to set?

Python: Add list to set?



Tested on Python 2.6 interpreter:


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



I think that I can't add the list to the set because there's no way Python can tell If I have added the same list twice. Is there a workaround?



EDIT: I want to add the list itself, not its elements.






Do you want to add the list to the set or the items in the list?

– pkit
Aug 20 '09 at 14:39






The list itself - I want to have a set of lists.

– Adam Matan
Aug 20 '09 at 14:41






Then use the tuple option that Otto answered.

– pkit
Aug 20 '09 at 14:43




12 Answers
12



You can't add a list to a set because lists are mutable, meaning that you can change the contents of the list after adding it to the set.



You can however add tuples to the set, because you cannot change the contents of a tuple:


>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])



Edit: some explanation: The documentation defines a set as an unordered collection of distinct hashable objects. The objects have to be hashable so that finding, adding and removing elements can be done faster than looking at each individual element every time you perform these operations. The specific algorithms used are explained in the Wikipedia article. Pythons hashing algorithms are explained on effbot.org and pythons __hash__ function in the python reference.


set


__hash__



Some facts:


list


tuple


set


frozenset


dict






And if you ever want to add a set to a set, use frozenset.

– FogleBird
Aug 20 '09 at 14:46






collections.namedtuple might be considered "official" counterpart of the dict.

– SilentGhost
Aug 20 '09 at 15:28


collections.namedtuple


dict






@FogleBird or the union operator: |=

– aehlke
Aug 20 '09 at 17:26






@Wahnfrieden: that is adding the contents of a set, not the set itself.

– Otto Allmendinger
Aug 20 '09 at 21:49






Well answered. The tuple() function is also worth mentioning.

– Adam Matan
Aug 22 '09 at 11:14



Use set.update() or |=


set.update()


|=


>>> a = set('abc')
>>> l = ['d', 'e']
>>> a.update(l)
>>> a
'e', 'b', 'c', 'd', 'a'

>>> l = ['f', 'g']
>>> a |= set(l)
>>> a
'e', 'b', 'f', 'c', 'd', 'g', 'a'



edit: If you want to add the list itself and not its members, then you must use a tuple, unfortunately. Set members must be hashable.



To add the elements of a list to a set, use update


update



From https://docs.python.org/2/library/sets.html



s.update(t): return set s with elements added from t



E.g.


>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
1, 2, 3, 4



If you instead want to add the entire list as a single element to the set, you can't because lists aren't hashable. You could instead add a tuple, e.g. s.add(tuple(l)). See also TypeError: unhashable type: 'list' when using built-in set function for more information on that.


s.add(tuple(l))






Works like charm

– Indra
Feb 4 at 12:15



Hopefully this helps:


>>> seta = set('1234')
>>> listb = ['a','b','c']
>>> seta.union(listb)
set(['a', 'c', 'b', '1', '3', '2', '4'])
>>> seta
set(['1', '3', '2', '4'])
>>> seta = seta.union(listb)
>>> seta
set(['a', 'c', 'b', '1', '3', '2', '4'])



Please notice the function set.update(). The documentation says:


set.update()



Update a set with the union of itself and others.






This doesn't answer the question (since the OP wants to add the list itself to the set) but it was the answer that I needed when Google brought me here :-)

– tom stratton
Mar 26 '13 at 16:48






Well, it seems like the most relevant answer to the question to me... for instance, if b = set([1]), b.update([7,25]) will give b the following value : set([1, 25, 7]) ---> Isn't it what we're looking for here?

– Louis LC
Oct 19 '14 at 22:16




list objects are unhashable. you might want to turn them in to tuples though.



Sets can't have mutable (changeable) elements/members. A list, being mutable, cannot be a member of a set.



As sets are mutable, you cannot have a set of sets!
You can have a set of frozensets though.



(The same kind of "mutability requirement" applies to the keys of a dict.)



Other answers have already given you code, I hope this gives a bit of insight.
I'm hoping Alex Martelli will answer with even more details.



You want to add a tuple, not a list:


>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])



If you have a list, you can convert to the tuple, as shown above. A tuple is immutable, so it can be added to the set.



You'll want to use tuples, which are hashable (you can't hash a mutable object like a list).


>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])



I found I needed to do something similar today. The algorithm knew when it was creating a new list that needed to added to the set, but not when it would have finished operating on the list.



Anyway, the behaviour I wanted was for set to use id rather than hash. As such I found mydict[id(mylist)] = mylist instead of myset.add(mylist) to offer the behaviour I wanted.


id


hash


mydict[id(mylist)] = mylist


myset.add(mylist)



Here is how I usually do it:


def add_list_to_set(my_list, my_set):
[my_set.add(each) for each in my_list]
return my_set



This should do:


set(tuple(i) for i in L)



Thanks for contributing an answer to Stack Overflow!



But avoid



To learn more, see our tips on writing great answers.



Required, but never shown



Required, but never shown




By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

ャフサォクコ ケウ,コ,ワ メ,ロスョノ゙,クネ,フムカヤヲニ,エコ゚ツ ウイオン゙ケワサネォキモュキォウイノンコチ゚メヌナイゥフュ,カヒウネェ ネ,ホノケ,ムュキ ッボーミュハ,チ ツス ィ メウイマヤ,゙ウチ ヅ ロ,ォジヌェ ャヌット ェ,マャ,チナエヒネソキツテ トホヲヲミーァ

How do I collapse sections of code in Visual Studio Code for Windows?