Ich bin kürzlich auf ein Szenario gestoßen, in dem ich etwas mit diesem Element tun wollte, wenn eine Menge nur ein einzelnes Element enthielt. Um das Element zu erhalten, habe ich mich für diesen Ansatz entschieden:
element = list(myset)[0]
Dies ist jedoch nicht sehr zufriedenstellend, da eine unnötige Liste erstellt wird. Es könnte auch mit Iteration durchgeführt werden, aber Iteration scheint auch unnatürlich, da es nur ein einziges Element gibt. Vermisse ich etwas Einfaches?
element ,= myset
[element] = myset
next(iter(myset))
Ausdruck hat den Vorteil, dass er ohne spezielle Zuweisung verwendet werden kann, sodass Sie ihn beispielsweise als Argument an eine Funktion übergeben können.Zwischen dem Erstellen eines Tupels und dem Erstellen eines Iterators ist es fast eine Wäsche, aber die 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
Ich bin mir nicht sicher, warum alle Antworten die ältere Syntax
iter(x).next()
anstelle der neuen verwendennext(iter(x))
, was mir vorzuziehen scheint (und auch in Python 3.1 funktioniert).Das Auspacken gewinnt jedoch zweifellos ü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
Dies gilt natürlich für Sets mit einem Gegenstand (wobei die letztere Form, wie andere erwähnt haben, den Vorteil hat, schnell zu versagen, wenn der Satz, den Sie "kannten", nur einen Gegenstand hatte, tatsächlich mehrere hatte). Bei Sätzen mit beliebigen N> 1-Elementen verlangsamt sich das Tupel, der 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
Das Auspacken für den Einzelfall und
next(iter(x))
für den allgemeinen Fall scheint also am besten zu sein.quelle
python
Python 2.5 auf meinem System. Daher wird angezeigt, was passiert, wenn ich meine Tastenkombination drücke, um eine Python-Konsole zu öffnen.next(..)
in Python 2.6 verfügbar ist, verstehe ich Ihren Standpunkt jetzt viel besser! Das sind gute Neuigkeiten.Ich denke, die Antwort von kaizer.se ist großartig. Aber wenn Ihr Satz könnte mehr als ein Element enthalten, und Sie wollen ein nicht-so-beliebiges Element, mögen Sie vielleicht verwenden
min
odermax
. Z.B:oder:
(Nicht verwenden
sorted
, da dies für diese Verwendung unnötigen Overhead bedeutet.)quelle
Ich schlage vor:
quelle
element = myset.copy().pop()
Sie können verwenden,
element = tuple(myset)[0]
was ein bisschen effizienter ist, oder Sie können so etwas tunIch denke, das Erstellen eines Iterators ist effizienter als das Erstellen eines Tupels / einer Liste.
quelle
Es gibt auch Extended Iterable Unpacking, das für ein Singleton-Set oder ein Mulit-Element-Set geeignet ist
element, *_ = myset
Obwohl einige Borsten bei der Verwendung einer Wegwerfvariablen.
quelle