파이썬에서 단일 멤버 세트에서 멤버를 추출하는 방법은 무엇입니까?
최근에 집합에 단일 요소 만 포함 된 경우 해당 요소로 무언가를하고 싶은 시나리오가 발생했습니다. 요소를 얻기 위해 다음 접근 방식을 결정했습니다.
element = list(myset)[0]
그러나 이것은 불필요한 목록을 생성하기 때문에 그다지 만족스럽지 않습니다. 반복으로도 수행 할 수 있지만 반복은 단일 요소 만 있기 때문에 부 자연스럽게 보입니다. 나는 단순한 것을 놓치고 있습니까?
튜플 풀기 작동합니다.
(element,) = myset
(그런데 python-dev는 탐색했지만 myset.get()
세트에서 임의의 요소를 반환하는 추가를 거부했습니다 . 여기서 토론 , Guido van Rossum은 1 과 2에 대한 답변 입니다.)
임의의 요소를 얻는 데 개인적으로 가장 좋아하는 것은 (알 수없는 숫자가 있지만 하나만있는 경우에도 작동합니다) :
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()
반복자를 구성하는 것이 튜플 / 목록을 구성하는 것보다 더 효율적이라고 생각합니다.
'UFO ET IT' 카테고리의 다른 글
Scheme 또는 일반적으로 사용되는 'thunk'는 무엇입니까? (0) | 2020.12.29 |
---|---|
Enter 키로 양식 제출 방지 (0) | 2020.12.29 |
두 정수의 최소 공배수를 계산하는 가장 효율적인 방법은 무엇입니까? (0) | 2020.12.29 |
jQuery : 태그 이름을 변경하는 방법? (0) | 2020.12.29 |
프로그래밍 방식으로 레이아웃의 가시성을 변경하는 방법 (0) | 2020.12.29 |