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?

War es hilfreich?

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

tun
element = iter(myset).next()

ich denke, ein Iterator Konstruktion effizienter ist ein Tupel / Liste als zu konstruieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top