최근 한 세트에 하나의 요소 만 포함되어 있다면 그 요소로 무언가를하고 싶었습니다. 요소를 얻으려면 다음과 같은 방법으로 해결했습니다.파이썬에서 단일 멤버 집합에서 멤버를 추출하는 방법은 무엇입니까?
불필요한 목록을 생성하므로 매우 만족스럽지 않습니다. 반복으로도 수행 될 수 있지만 반복은 하나의 요소 만 있기 때문에 부자연 스럽습니다. 나는 간단한 것을 놓치고 있습니까?
최근 한 세트에 하나의 요소 만 포함되어 있다면 그 요소로 무언가를하고 싶었습니다. 요소를 얻으려면 다음과 같은 방법으로 해결했습니다.파이썬에서 단일 멤버 집합에서 멤버를 추출하는 방법은 무엇입니까?
불필요한 목록을 생성하므로 매우 만족스럽지 않습니다. 반복으로도 수행 될 수 있지만 반복은 하나의 요소 만 있기 때문에 부자연 스럽습니다. 나는 간단한 것을 놓치고 있습니까?
튜플 압축 풀기 작업.
(element,) = myset
(그런데, 파이썬 디바이스가 탐색하지만 myset.get의 추가를 거부()가 세트로부터의 임의의 요소를 반환. Discussion here을 귀도 반 로섬 1 및 2 대답.)
임의의 요소를 얻기를위한 나의 개인의 마음에 드는 사람은이다 (당신은 알 수없는 번호를 가지고,하지만 당신은 단지 하나가있는 경우에도 작동시) :
element = next(iter(myset)) ¹
: 파이썬 2.5과 befor를 전자, 당신이 iter(myset).next()
이
당신이 좀 더 효율적으로, 또는 element = tuple(myset)[0]
을 사용할 수 사용해야합니다, 당신은
element = iter(myset).next()
내가 반복자는 튜플/목록을 구성하는 것보다 더 효율적인 건설 추측처럼 뭔가를 할 수 . 튜플을 만들고 반복자를 만드는 사이
반복기를 만드는 것이 더 효율적이라고 생각하는 이유는 무엇입니까? –
운좋게도, 나는 Alex의 반응을 알려준다. –
, 그것은 ... 코에 의해 거의 세척,하지만 반복 승리의 : 모든 답변을보다 더 오래된 구문 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))
, 가장 좋은 것 같다.
왜 Python2.x 구문인가? 파이썬은 파이썬 2.5를 사용하기 때문에 파이썬 콘솔을 열기 위해 제 키 바인딩을 눌러야합니다. – u0b34a0f6ae
2.6은 "실제 프로그래밍"에 완벽하게 사용할 수 있으며 2.5보다 풍부합니다. 2.5를 고수해야하는 유일한 이유는 외부 환경이 당신 (App Engine, Civilization 4 등)에 제약을 가하는 경우입니다. next (x)와 x.next()는 모두 2.6에서 작동하지만 next (x)가 더 좋습니다 (StopIteration 예외를 포착하는 대신 기본값을 지정할 수 있습니다. –
@Alex : 저를 납득시킬 필요가 없습니다. 파이썬 2.6을 사용하는 편이 낫습니다. 나는 데비안을 사용하는데, 데비안은 아직 파이썬 2.6으로 전환하지 않았습니다! (Python 2.6 자체는 사용할 수 있지만 배포판의 3 부 라이브러리는 없습니다.) – u0b34a0f6ae
제가 kaizer.se's answer라고 생각합니다. 하지만 세트에에 둘 이상의 요소가 포함되어 있고 임의적이지 않은 요소를 원할 경우 min
또는 max
을 사용할 수 있습니다. 예컨대 :
element = min(myset)
나 :
element = max(myset)
(이것은이 사용에 대한 불필요한 오버 헤드를 가지고 그 때문에, sorted
를 사용하지 마십시오.)
아주 좋은! 요소 수가 1이 아니면 실패합니다. –
@Laurence : 좋은 관찰입니다. 조기에 오류를 잡아라. 그렇지? – u0b34a0f6ae
아니면, 파이썬이 그 작업에 적합한 연산자를 가지고 있다고 가정한다면 (동료는 당신을 싫어할 것입니다) :'element, = myset' – rdb