最近、セットに単一の要素しか含まれていない場合、その要素を使用して何かを実行したいというシナリオに遭遇しました。要素を取得するために、私はこのアプローチに落ち着きました:
element = list(myset)[0]
しかし、これは不必要なリストを作成するため、あまり満足のいくものではありません。反復で行うこともできますが、要素が1つしかないため、反復も不自然に見えます。簡単なものがないですか?
タプルを作成してからイテレータを作成するまでの間に、それはほとんど洗浄ですが、反復は鼻で勝ちます...:
_$ 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))
が最適です。
私は考えます kaizer.seの答え は素晴らしいです。しかし、セットmightに複数の要素が含まれていて、任意ではない要素が必要な場合は、 min
または max
。例えば。:
element = min(myset)
または:
element = max(myset)
( sorted
を使用しないでください。この使用法では不要なオーバーヘッドがあるためです。)
私は提案します:
element = myset.pop()
もう少し効率的なelement = Tuple(myset)[0]
を使用できます。または、次のようなことができます
element = iter(myset).next()
イテレータを作成する方がタプル/リストを作成するよりも効率的だと思います。