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

iterable의 모든 항목을 기존에 추가 하는 “하나의 […] 명백한 방법”set무엇입니까?



답변

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


답변

예를 들어 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됩니다.


답변

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

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


답변

간단한 업데이트, 파이썬 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


답변

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

예를 들어 목록을 사용하여 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])
>>> 

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


답변

for item in items:
   extant_set.add(item)

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

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


답변