파이썬 : 설정할 목록을 추가 하시겠습니까?
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.org 및 pythons__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
'IT story' 카테고리의 다른 글
PHP에서 함수 / 메소드 호출 이름을 얻는 방법은 무엇입니까? (0) | 2020.05.09 |
---|---|
영숫자 텍스트에서 선행 0을 제거하는 방법? (0) | 2020.05.09 |
특정 경도와 위도로 Google지도에 연결하려면 어떻게해야하나요? (0) | 2020.05.09 |
문자열을 배열에 넣는 방법, 줄 바꿈? (0) | 2020.05.09 |
RESTful 서비스에서 부분 업데이트에 대한 모범 사례 (0) | 2020.05.09 |