IT story

파이썬 : 설정할 목록을 추가 하시겠습니까?

hot-time 2020. 5. 9. 09:19
반응형

파이썬 : 설정할 목록을 추가 하시겠습니까?


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

파이썬이 같은 목록을 두 번 추가했는지 알 수있는 방법이 없기 때문에 목록에 목록을 추가 할 수 없다고 생각합니다. 해결 방법이 있습니까?

편집 : 목록이 아닌 요소 자체를 추가하고 싶습니다.


목록은 변경 가능하므로 목록에 목록을 추가 할 수 없습니다. 즉, 목록에 목록을 추가 한 후 목록의 내용을 변경할 수 있습니다.

그러나 튜플의 내용을 변경할 수 없으므로 튜플을 세트에 추가 할 수 있습니다.

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

편집 : 일부 설명 :이 설명서는 정렬되지 않은 고유 한 해시 가능 객체 모음set 으로 정의 합니다. 이러한 작업을 수행 할 때마다 각 개별 요소를 보는 것보다 빠르게 요소를 찾고 추가하고 제거 할 수 있도록 개체를 해시 가능해야합니다. 사용 된 특정 알고리즘은 Wikipedia 기사에 설명되어 있습니다. 파이썬 해싱 알고리즘은 파이썬 참조의 effbot.orgpythons__hash__ 함수에 설명되어 있습니다.

몇 가지 사실 :

  • 사전 키 뿐만 아니라 세트 요소해시 가능해야합니다
  • 해싱 불가능한 일부 데이터 유형 :
    • list: tuple대신 사용
    • set: frozenset대신 사용
    • dict: 공식적인 대응은 없지만 몇 가지 요리법이 있습니다.
  • 객체 인스턴스는 기본적으로 해시 가능하며 각 인스턴스마다 고유 한 해시가 있습니다. 파이썬 참조에 설명 된대로이 동작을 무시할 수 있습니다.

사용 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'}

편집 : 멤버가 아닌 목록 자체를 추가하려면 불행히도 튜플을 사용해야합니다. 세트 멤버는 해시 가능 해야합니다 .


하려면 집합에 목록의 요소를 추가 , 사용update

에서 https://docs.python.org/2/library/sets.html

s.update (t) : t에서 추가 된 요소를 가진 집합 s를 반환

예 :

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


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:

Update a set with the union of itself and others.


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.


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)

참고URL : https://stackoverflow.com/questions/1306631/python-add-list-to-set

반응형