web-dev-qa-db-ja.com

Pythonで単一メンバーセットからメンバーを抽出するにはどうすればよいですか?

最近、セットに単一の要素しか含まれていない場合、その要素を使用して何かを実行したいというシナリオに遭遇しました。要素を取得するために、私はこのアプローチに落ち着きました:

element = list(myset)[0]

しかし、これは不必要なリストを作成するため、あまり満足のいくものではありません。反復で行うこともできますが、要素が1つしかないため、反復も不自然に見えます。簡単なものがないですか?

56
recursive

タプルの解凍作業。

_(element,) = myset
_

(ちなみに、python-devは、セットから任意の要素を返すためのmyset.get()の追加を検討しましたが拒否しました。 ここで議論 、Guido van Rossumが答えます 1 および 2

任意の要素を取得するための私の個人的なお気に入りは次のとおりです(不明な番号がある場合でも、1つしかない場合でも機能します)。

_element = next(iter(myset)) ¹
_

1:Python 2.5以前では、iter(myset).next()を使用する必要があります

82
u0b34a0f6ae

タプルを作成してからイテレータを作成するまでの間に、それはほとんど洗浄ですが、反復は鼻で勝ちます...:

_$ 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
_

もちろん、これは単一アイテムのセット用です(後者のフォームは、他の人が述べたように、実際に「知っている」セットが1つのアイテムしか持っていなかった場合、複数のアイテムがあった場合、すぐに失敗するという利点があります)。任意の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))が最適です。

21
Alex Martelli

私は考えます kaizer.seの答え は素晴らしいです。しかし、セットmightに複数の要素が含まれていて、任意ではない要素が必要な場合は、 min または max 。例えば。:

element = min(myset)

または:

element = max(myset)

sorted を使用しないでください。この使用法では不要なオーバーヘッドがあるためです。)

13
Craig McQueen

私は提案します:

element = myset.pop()
4
Helmut

もう少し効率的なelement = Tuple(myset)[0]を使用できます。または、次のようなことができます

element = iter(myset).next()

イテレータを作成する方がタプル/リストを作成するよりも効率的だと思います。

2
Oren S