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


242

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

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

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


2
세트 또는 목록의 항목에 목록을 추가 하시겠습니까?
pkit

목록 자체-목록 세트를 갖고 싶습니다.
Adam Matan

가장 적합한 답변은 과소 평가 된 것으로 보이며, 목록 / 대기열 등에 lst 자체를 추가하기 전에 aSet.add (id (lst))를 사용하여 제안합니다. 허용 된 답변을 다시 고려해야합니다.
Rustam A.

답변:


187

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

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

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

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

몇 가지 사실 :

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

6
세트에 세트를 추가하려면 frozenset을 사용하십시오.
FogleBird

4
collections.namedtuple의 "공식적인"상대로 간주 될 수 있습니다 dict.
SilentGhost

1
@ Wanfrieden : 세트 자체가 아닌 세트 의 내용 을 추가합니다 .
Otto Allmendinger

@aehlke : 아니요, 세트의 요소를 첫 번째 세트에 추가하지만 세트를 첫 번째 세트의 요소로 추가하는 것에 대해 이야기하고 있습니다.
Jeff Learman

578

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

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


set.update ()는 목록을 세트에 추가합니다. 맞습니까? 파이프와 연산자는 무엇입니까?
FistOfFury

세트와 관련하여 |연산자는 조합 설정 작업을 구현합니다 . |=연산자와 set.update()방법 모두 해당 작업을 제자리에 적용하며 사실상 동의어입니다. 그래서, set_a |= set_b모두 문법적으로 간주 될 수 set_a.update(set_b) set_a = set_a | set_b (후자의 경우, 같은 것을 제외하고 set_a개체를 재사용하기보다는 재 할당됩니다). </ahem>
Cecil Curry

76

하려면 집합에 목록의 요소를 추가 , 사용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' 를 참조하십시오.


40

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

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

15

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

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


5
(영업 이익이 세트 목록 자체를 추가하고 싶어하기 때문에)이 질문에 대답하지 않습니다하지만 구글이 :-) 날 여기로 데려 때이 필요하다고 대답했다
톰 스트래튼을

1
예를 들어, b = set ([1]), b.update ([7,25])는 b에 다음과 같은 값을 줄 것입니다. set ([ 1, 25, 7]) ---> 우리가 찾는 것이 아닌가요?
Louis LC

8

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


5

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

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

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

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


4

리스트가 아닌 튜플을 추가하려고합니다.

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

목록이 있으면 위와 같이 튜플로 변환 할 수 있습니다. 튜플은 변경할 수 없으므로 세트에 추가 할 수 있습니다.


4

나는 오늘 비슷한 일을해야한다는 것을 알았습니다. 알고리즘은 세트에 추가해야하는 새 목록을 작성하는시기를 알고 있었지만 목록에서 작업을 완료 한시기는 알지 못했습니다.

어쨌든, 내가 원하는 행동은 id대신 에 사용하도록 설정되었습니다 hash. 따라서 나는 내가 원하는 행동을 제공하는 mydict[id(mylist)] = mylist대신 발견 myset.add(mylist)했습니다.


3

해시 가능한 튜플을 사용하고 싶을 것입니다 (목록과 같이 변경 가능한 객체를 해시 할 수는 없습니다).

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

2

내가 일반적으로하는 방법은 다음과 같습니다.

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

-4

이것은해야합니다 :

set(tuple(i) for i in L)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.