개발/Python

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

MinorMan 2020. 9. 18. 11:40
반응형

<질문>

이터 러블의 모든 항목을 기존 세트에 추가하는 "하나의 [...] 명백한 방법"은 무엇입니까?


<답변1>

다음과 같이 목록의 요소를 집합에 추가 할 수 있습니다.

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

예를 들어 루프에서 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 배 이상인 것 같습니다.

| = set ()을 사용하면 업데이트가 수행하는 작업의 약 1.5 배가 소요되지만 루프에 각 개별 항목을 추가하는 작업의 절반이 소요됩니다.


<답변3>

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

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

<답변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

<답변5>

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

예를 들어 목록을 사용하여 반복 가능 생성을 단락시킵니다. :)

>>> x = [1, 2, 3, 4]
>>> 
>>> k = x.__iter__()
>>> k

>>> l = [y for y in k]
>>> l
[1, 2, 3, 4]
>>> 
>>> z = Set([1,2])
>>> z.update(l)
>>> z
set([1, 2, 3, 4])
>>> 

[편집 : 질문의 설정된 부분 누락]


<답변6>

for item in items:
   extant_set.add(item)

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

나는 내가 제안한 솔루션이 명확하게 읽을 수 있다고 주장하고 당신이 요청한 것을 수행합니다. 나는 그것과 관련된 어떤 성능 적중도 없다고 생각한다. 비록 내가 무언가를 놓치고 있을지도 모른다는 것을 인정하지만. 그러나 그 모든 것에도 불구하고 다른 개발자에게는 명확하지 않고 선호되지 않을 수 있습니다.

반응형