UFO ET IT

파이썬에서 단일 멤버 세트에서 멤버를 추출하는 방법은 무엇입니까?

ufoet 2020. 12. 29. 07:36
반응형

파이썬에서 단일 멤버 세트에서 멤버를 추출하는 방법은 무엇입니까?


최근에 집합에 단일 요소 만 포함 된 경우 해당 요소로 무언가를하고 싶은 시나리오가 발생했습니다. 요소를 얻기 위해 다음 접근 방식을 결정했습니다.

element = list(myset)[0]

그러나 이것은 불필요한 목록을 생성하기 때문에 그다지 만족스럽지 않습니다. 반복으로도 수행 할 수 있지만 반복은 단일 요소 만 있기 때문에 부 자연스럽게 보입니다. 나는 단순한 것을 놓치고 있습니까?


튜플 풀기 작동합니다.

(element,) = myset

(그런데 python-dev는 탐색했지만 myset.get()세트에서 임의의 요소를 반환하는 추가를 거부했습니다 . 여기서 토론 , Guido van Rossum은 12에 대한 답변 입니다.)

임의의 요소를 얻는 데 개인적으로 가장 좋아하는 것은 (알 수없는 숫자가 있지만 하나만있는 경우에도 작동합니다) :

element = next(iter(myset)) ¹

1 : Python 2.5 이전에서는 다음을 사용해야합니다.iter(myset).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

모든 답변이 iter(x).next()구문이 아닌 이전 구문을 사용하는 이유가 확실하지 않습니다.이 구문 next(iter(x))은 나에게 바람직해 보입니다 (그리고 Python 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 개 항목이있는 세트의 경우 튜플 속도가 느려지고 이터는 다음을 수행하지 않습니다.

$ 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))일반 케이스의 경우 포장을 푸는 것이 가장 좋습니다.


나는 kaizer.se의 대답 이 훌륭 하다고 생각 합니다. 그러나 세트에 둘 이상의 요소 포함되어 있고 임의적이지 않은 요소를 원하는 경우 min또는 을 사용할 수 있습니다 max. 예 :

element = min(myset)

또는:

element = max(myset)

( sorted이 사용에 불필요한 오버 헤드가 있으므로를 사용하지 마십시오 .)


나는 제안한다 :

element = myset.pop()

당신이 사용할 수있는 element = tuple(myset)[0]좀 더 효율적이다, 또는, 당신처럼 뭔가를 할 수

element = iter(myset).next()

반복자를 구성하는 것이 튜플 / 목록을 구성하는 것보다 더 효율적이라고 생각합니다.

참조 URL : https://stackoverflow.com/questions/1619514/how-to-extract-the-member-from-single-member-set-in-python

반응형