iterable의 내용을 세트에 어떻게 추가합니까?


답변:


228

a의 요소 list를 다음 set과 같이 추가 할 수 있습니다 .

>>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])

2
방금 통역 세션을 되돌아 보았고 실제로 시도했지만 세트의 표현에서 대괄호로 인해 전체 목록을 세트의 요소로 추가했다고 생각했습니다. 나는 그들이 그렇게 표현되었다는 것을 눈치 채지 못했습니다.
Ian Mackinnon

7
set생성자는 iterable을 인수로 사용 하기 때문에 대화식 세션에서이를 다시 붙여 넣을 수 있습니다 .
Frank Kusters

3
표현은 예를 들어 {1, 2, 3}파이썬 3과 set([1, 2, 3])
비슷

40

예를 들어 aset.add()루프를 수행 aset.update()하면 성능이 경쟁사와 경쟁 할 수 있다고 믿는 사람의 이익을 위해 공개하기 전에 신념을 빠르게 테스트 할 수있는 방법의 예는 다음과 같습니다.

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 294 usec per loop

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 950 usec per loop

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 458 usec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 598 usec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 1.89 msec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 891 usec per loop

루프 접근 방식의 항목 당 비용이 접근 방식의 3 배 이상인 것 같습니다 update.

루프에서 각 개별 항목을 추가하는 것의 절반에 |= set()비해 약 1.5 배의 비용이 사용 update됩니다.


14

set () 함수를 사용하여 iterable을 세트로 변환 한 다음 표준 세트 업데이트 연산자 (| =)를 사용하여 새 세트의 고유 값을 기존 세트에 추가 할 수 있습니다.

>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])

5
를 사용하면 예제 .update에서 |=연산자 의 RHS와 달리 인수가 반복 가능할 수 있으며 반드시 세트 일 필요는 없다는 장점이 있습니다 .
tzot

1
좋은 지적. set ()이 iterable을 세트로 변환 할 수 있기 때문에 미학적 선택이지만 키 입력 횟수는 동일합니다.
gbc

나는 그 연산자를 전에 본 적이 없다. 나는 그것이 팝업 될 때 그것을 사용하는 것을 좋아할 것이다. 감사!
eipxen

1
@eipxen : |결합, &교차 및 ^둘 중 하나에 있지만 둘 다에없는 요소를 가져 오는 경우가 있습니다. 그러나 때로는 코드를 읽고 주위를 비행하는 객체의 유형을 파악하기 어려운 동적 유형 언어에서는 이러한 연산자를 사용하는 것이 주저합니다. 그것들을 인식하지 못하는 (또는 파이썬이 이와 같은 연산자를 허용한다는 것을 알지 못하는) 누군가 혼란스럽고 이상한 비트 또는 논리 연산이 진행되고 있다고 생각할 수 있습니다. 이 연산자가 다른 iterables에서도 작업했다면 좋을 것
같습니다

이것에 대한 시간 테스트를 실행 .update()하고 루프에 개별 요소를 추가하십시오. 발견 .update()빨랐다. 나는이 기존의 대답에 내 결과를 추가 : stackoverflow.com/a/4046249/901641
ArtOfWarfare

4

간단한 업데이트, 파이썬 3을 사용한 타이밍 :

#!/usr/local/bin python3
from timeit import Timer

a = set(range(1, 100000))
b = list(range(50000, 150000))

def one_by_one(s, l):
    for i in l:
        s.add(i)    

def cast_to_list_and_back(s, l):
    s = set(list(s) + l)

def update_set(s,l):
    s.update(l)

결과는 다음과 같습니다

one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082

0

목록 이해력을 사용하십시오.

예를 들어 목록을 사용하여 iterable 작성을 단락

>>> x = [1, 2, 3, 4]
>>> 
>>> k = x.__iter__()
>>> k
<listiterator object at 0x100517490>
>>> l = [y for y in k]
>>> l
[1, 2, 3, 4]
>>> 
>>> z = Set([1,2])
>>> z.update(l)
>>> z
set([1, 2, 3, 4])
>>> 

[편집 : 질문의 정해진 부분을 놓쳤다]


1
세트가 보이지 않습니까? 뭔가 빠졌습니까?
Ian Mackinnon

-2
for item in items:
   extant_set.add(item)

기록을 위해, 나는 "한 가지 분명한 방법이 있어야한다"고 주장한다. 가짜입니다. 그것은 많은 기술적 인 생각을 가진 사람들이 만들고 모든 사람이 똑같이 생각한다고 가정합니다. 한 사람에게 분명한 것은 다른 사람에게는 분명하지 않습니다.

제안 된 솔루션을 명확하게 읽을 수 있으며 요청한 내용을 수행한다고 주장합니다. 성능 저하가 있다고 생각하지는 않지만 뭔가 빠졌을 수도 있습니다. 그러나이 모든 것에도 불구하고 다른 개발자에게는 분명하지 않고 바람직하지 않을 수 있습니다.


아아! for 루프가 한 줄에있는 것은 내 대답에서 서식을 지정하는 것입니다. 이제까지.
jaydel

당신은 절대적으로 맞습니다. 손상을 복구하기 위해 게시물을 편집했습니다. 감사합니다 :)
jaydel

9
항목 당 메서드 조회 및 메서드 호출 (aarrgghh !!)과 함께 aset.update(iterable)C 속도로 반복 되는 지점 for item in iterable: aset.add(item)과 Python 속도로 반복 되는 지점이 없습니다 .
John Machin

1
미안하지만, 그는 질문에 대한 성과에 대해 아무 말도하지 않았으므로 걱정하지 않았습니다.
jaydel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.