[python] 설정할 목록을 추가 하시겠습니까?

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}

대신 전체 목록을 단일 요소 로 세트 에 추가 하려는 경우 목록을 해시 할 수 없기 때문에 할 수 없습니다. 대신 튜플을 추가 할 수 있습니다 (예 🙂 s.add(tuple(l)). 이에 대한 자세한 내용은 기본 제공 set 함수사용할 때 TypeError : unhashable type : ‘list’ 를 참조하십시오.


답변

희망적으로 이것은 도움이됩니다 :

>>> 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'])


답변

기능에 주목하십시오 set.update(). 설명서는 다음과 같이 말합니다.

자신과 다른 사람의 조합으로 세트를 업데이트하십시오.


답변

리스트 객체는 해싱 불가능하다 . 그래도 튜플로 바꾸고 싶을 수도 있습니다.


답변

세트는 변경 가능 (변경 가능) 요소 / 멤버를 가질 수 없습니다. 변경 가능한 목록은 세트의 멤버가 될 수 없습니다.

세트는 변경 가능하므로 세트 세트를 가질 수 없습니다! 그래도 고정 세트를 가질 수 있습니다.

(같은 종류의 “변경 요구 사항”은 dict의 키에 적용됩니다.)

다른 답변이 이미 코드를 제공했기 때문에 약간의 통찰력이 있기를 바랍니다. Alex Martelli가 더 자세한 내용으로 대답하기를 바랍니다.