2009-10-24 3 views
42

최근 한 세트에 하나의 요소 만 포함되어 있다면 그 요소로 무언가를하고 싶었습니다. 요소를 얻으려면 다음과 같은 방법으로 해결했습니다.파이썬에서 단일 멤버 집합에서 멤버를 추출하는 방법은 무엇입니까?

불필요한 목록을 생성하므로 매우 만족스럽지 않습니다. 반복으로도 수행 될 수 있지만 반복은 하나의 요소 만 있기 때문에 부자연 스럽습니다. 나는 간단한 것을 놓치고 있습니까?

답변

62

튜플 압축 풀기 작업.

(element,) = myset 

(그런데, 파이썬 디바이스가 탐색하지만 myset.get의 추가를 거부()가 세트로부터의 임의의 요소를 반환. Discussion here을 귀도 반 로섬 12 대답.)

임의의 요소를 얻기를위한 나의 개인의 마음에 드는 사람은이다 (당신은 알 수없는 번호를 가지고,하지만 당신은 단지 하나가있는 경우에도 작동시) :

element = next(iter(myset)) ¹ 

: 파이썬 2.5과 befor를 전자, 당신이 iter(myset).next()

+6

아주 좋은! 요소 수가 1이 아니면 실패합니다. –

+0

@Laurence : 좋은 관찰입니다. 조기에 오류를 잡아라. 그렇지? – u0b34a0f6ae

+2

아니면, 파이썬이 그 작업에 적합한 연산자를 가지고 있다고 가정한다면 (동료는 당신을 싫어할 것입니다) :'element, = myset' – rdb

2

당신이 좀 더 효율적으로, 또는 element = tuple(myset)[0]을 사용할 수 사용해야합니다, 당신은

element = iter(myset).next() 

내가 반복자는 튜플/목록을 구성하는 것보다 더 효율적인 건설 추측처럼 뭔가를 할 수 . 튜플을 만들고 반복자를 만드는 사이

+0

반복기를 만드는 것이 더 효율적이라고 생각하는 이유는 무엇입니까? –

+0

운좋게도, 나는 Alex의 반응을 알려준다. –

17

, 그것은 ... 코에 의해 거의 세척,하지만 반복 승리의 : 모든 답변을보다 더 오래된 구문 iter(x).next()를 대신 사용하는 이유를 확인

$ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]' 
1000000 loops, best of 3: 0.465 usec per loop 
$ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]' 
1000000 loops, best of 3: 0.465 usec per loop 
$ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))' 
1000000 loops, best of 3: 0.456 usec per loop 
$ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))' 
1000000 loops, best of 3: 0.456 usec per loop 

하지 않음 새로운 하나의 next(iter(x)), 내게 좋을 것 같고 (또한 파이썬 3.1에서 작동).

그러나 둘다 풀고 승리의 손 다운 :

$ python2.6 -mtimeit -s'x=set([1])' 'a,=x' 
10000000 loops, best of 3: 0.174 usec per loop 
$ python2.6 -mtimeit -s'x=set([1])' 'a,=x' 
10000000 loops, best of 3: 0.174 usec per loop 

이 과정의 다른 사람이 언급 한 바와 같이, 실패의 이점이있다, (단일 항목 세트의 경우 후자의 형태이다 빠른 경우 설정하십시오 "알고있다"는 한 항목에 실제로 여러 항목이 있음). 임의의 N> 1 항목 세트의 경우, 튜플은 ITER하지 않습니다, 속도가 느려집니다 : 싱글의 경우에 풀고, 그래서

$ python2.6 -mtimeit -s'x=set(range(99))' 'a=next(iter(x))' 
1000000 loops, best of 3: 0.417 usec per loop 
$ python2.6 -mtimeit -s'x=set(range(99))' 'a=tuple(x)[0]' 
100000 loops, best of 3: 3.12 usec per loop 

, 그리고 일반적인 경우에 대한 next(iter(x)), 가장 좋은 것 같다.

+0

왜 Python2.x 구문인가? 파이썬은 파이썬 2.5를 사용하기 때문에 파이썬 콘솔을 열기 위해 제 키 바인딩을 눌러야합니다. – u0b34a0f6ae

+0

2.6은 "실제 프로그래밍"에 완벽하게 사용할 수 있으며 2.5보다 풍부합니다. 2.5를 고수해야하는 유일한 이유는 외부 환경이 당신 (App Engine, Civilization 4 등)에 제약을 가하는 경우입니다. next (x)와 x.next()는 모두 2.6에서 작동하지만 next (x)가 더 좋습니다 (StopIteration 예외를 포착하는 대신 기본값을 지정할 수 있습니다. –

+0

@Alex : 저를 납득시킬 필요가 없습니다. 파이썬 2.6을 사용하는 편이 낫습니다. 나는 데비안을 사용하는데, 데비안은 아직 파이썬 2.6으로 전환하지 않았습니다! (Python 2.6 자체는 사용할 수 있지만 배포판의 3 부 라이브러리는 없습니다.) – u0b34a0f6ae

11

제가 kaizer.se's answer라고 생각합니다. 하지만 세트에에 둘 이상의 요소가 포함되어 있고 임의적이지 않은 요소를 원할 경우 min 또는 max을 사용할 수 있습니다. 예컨대 :

element = min(myset) 

나 :

element = max(myset) 

(이것은이 사용에 대한 불필요한 오버 헤드를 가지고 그 때문에, sorted를 사용하지 마십시오.)

2

내가 제안 :

element = myset.pop() 
+0

일부 경우에는 작동하지만 세트가 변경됩니다. – recursive

관련 문제