iterable의 모든 항목을 기존에 추가 하는 "하나의 [...] 명백한 방법" 은 set
무엇입니까?
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])
set
생성자는 iterable을 인수로 사용 하기 때문에 대화식 세션에서이를 다시 붙여 넣을 수 있습니다 .
{1, 2, 3}
파이썬 3과 set([1, 2, 3])
예를 들어 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])
.update
에서 |=
연산자 의 RHS와 달리 인수가 반복 가능할 수 있으며 반드시 세트 일 필요는 없다는 장점이 있습니다 .
|
결합, &
교차 및 ^
둘 중 하나에 있지만 둘 다에없는 요소를 가져 오는 경우가 있습니다. 그러나 때로는 코드를 읽고 주위를 비행하는 객체의 유형을 파악하기 어려운 동적 유형 언어에서는 이러한 연산자를 사용하는 것이 주저합니다. 그것들을 인식하지 못하는 (또는 파이썬이 이와 같은 연산자를 허용한다는 것을 알지 못하는) 누군가 혼란스럽고 이상한 비트 또는 논리 연산이 진행되고 있다고 생각할 수 있습니다. 이 연산자가 다른 iterables에서도 작업했다면 좋을 것
.update()
하고 루프에 개별 요소를 추가하십시오. 발견 .update()
빨랐다. 나는이 기존의 대답에 내 결과를 추가 : stackoverflow.com/a/4046249/901641
간단한 업데이트, 파이썬 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)
기록을 위해, 나는 "한 가지 분명한 방법이 있어야한다"고 주장한다. 가짜입니다. 그것은 많은 기술적 인 생각을 가진 사람들이 만들고 모든 사람이 똑같이 생각한다고 가정합니다. 한 사람에게 분명한 것은 다른 사람에게는 분명하지 않습니다.
제안 된 솔루션을 명확하게 읽을 수 있으며 요청한 내용을 수행한다고 주장합니다. 성능 저하가 있다고 생각하지는 않지만 뭔가 빠졌을 수도 있습니다. 그러나이 모든 것에도 불구하고 다른 개발자에게는 분명하지 않고 바람직하지 않을 수 있습니다.
aset.update(iterable)
C 속도로 반복 되는 지점 for item in iterable: aset.add(item)
과 Python 속도로 반복 되는 지점이 없습니다 .