Wie das Element von Single-Mitglied in Python gesetzt zu extrahieren?
Frage
Ich habe vor kurzem ein Szenario, in dem festgestellt, wenn ein ein einzelnes Element nur enthalten Set, wollte ich etwas mit diesem Element tun. Um das Element zu erhalten, die ich auf diesem Ansatz angesiedelt:
element = list(myset)[0]
Das ist aber nicht sehr befriedigend, da es eine unnötige Liste erstellt. Es könnte auch mit Iteration erfolgen, aber Iteration scheint auch unnatürlich, da es nur ein einziges Element ist. Fehle ich etwas einfach?
Lösung
Tuple Auspacken funktioniert.
(element,) = myset
(By the way, python-dev hat erforscht, lehnte aber die Zugabe von myset.get()
ein beliebiges Element aus einem Satz zurück. Diskussion hier , Guido van Rossum Antworten 1 und 2 .)
Mein persönlicher Favorit für ein beliebiges Element bekommen ist (wenn Sie eine unbekannte Zahl, sondern auch funktionieren, wenn Sie nur eine haben):
element = next(iter(myset)) ¹
1 : in Python 2.5 und vor, Sie haben iter(myset).next()
verwenden
Andere Tipps
zwischen einem Tupel zu machen und einen Iterator zu machen, ist es fast ein waschen, aber Iteration gewinnt durch eine Nase ...:
$ 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
Nicht sicher, warum alle Antworten werden mit der älteren Syntax iter(x).next()
eher als die neuen next(iter(x))
, die ich zu bevorzugen scheint (und funktioniert auch in Python 3.1).
Allerdings Auspacken gewinnt die Hände nach unten über beide:
$ 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
Das ist natürlich für Single-Element-Sets (wobei die letztere Form, wie andere erwähnten, schnell den Vorteil versagt hat, wenn die Menge Sie hatte nur ein Element hatte tatsächlich mehr „wußte“). Für Geräte mit beliebigen N> 1 Artikel, verlangsamt sich das Tupel nach unten, hat die iter nicht:
$ 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
So , für den Fall Singleton Auspacken und next(iter(x))
für den allgemeinen Fall, scheint am besten.
Ich rechne damit, kaizer .se Antwort ist groß. Aber wenn Ihr Satz können enthalten mehr als ein Element, und Sie wollen eine nicht-so-beliebiges Element, können Sie verwenden min
oder max
. Z.
element = min(myset)
oder:
element = max(myset)
(Verwenden Sie keine sorted
, denn das unnötige Overhead für diese Nutzung.)
Ich schlage vor:
element = myset.pop()
Sie können element = tuple(myset)[0]
verwenden, die etwas effizienter ist, oder können Sie so etwas wie
element = iter(myset).next()
ich denke, ein Iterator Konstruktion effizienter ist ein Tupel / Liste als zu konstruieren.