680 Stimmen

Wie kann man ein Element aus einer Menge abrufen, ohne es zu entfernen?

Nehmen Sie Folgendes an:

>>> s = set([1, 2, 3])

Wie erhalte ich einen Wert (irgendeinen Wert) aus der s ohne zu tun s.pop() ? Ich möchte das Element in der Menge belassen, bis ich sicher bin, dass ich es entfernen kann - etwas, das ich nur nach einem asynchronen Aufruf an einen anderen Host sicher sein kann.

Schnell und schmutzig:

>>> elem = s.pop()
>>> s.add(elem)

Aber kennen Sie einen besseren Weg? Idealerweise in konstanter Zeit.

39 Stimmen

Weiß jemand, warum Python diese Funktion nicht bereits implementiert hat?

7 Stimmen

Was ist der Anwendungsfall? Set hat diese Fähigkeit aus einem bestimmten Grund nicht. Sie sollen durch sie iterieren und Set-bezogene Operationen durchführen wie union usw., ohne Elemente daraus zu entnehmen. Zum Beispiel next(iter({3,2,1})) gibt immer zurück 1 Wenn Sie also dachten, dass dies ein zufälliges Element zurückgeben würde - das stimmt nicht. Vielleicht verwenden Sie also einfach die falsche Datenstruktur? Was ist der Anwendungsfall?

1 Stimmen

Verwandt: stackoverflow.com/questions/20625579/ (Ich weiß, es ist nicht dieselbe Frage, aber es gibt lohnende Alternativen und Einsichten).

2voto

Josué Carvajal Punkte 66

Normalerweise erstelle ich für kleine Sammlungen eine Art Parser/Konverter-Methode wie diese

def convertSetToList(setName):
return list(setName)

Dann kann ich die neue Liste verwenden und nach Indexnummer zugreifen

userFields = convertSetToList(user)
name = request.json[userFields[0]]

In der Liste finden Sie alle anderen Methoden, mit denen Sie möglicherweise arbeiten müssen

2voto

seralouk Punkte 26706

Sie können die Werte auspacken, um auf die Elemente zuzugreifen:

s = set([1, 2, 3])

v1, v2, v3 = s

print(v1,v2,v3)
#1 2 3

0voto

Necho Punkte 474

Wenn Sie nur das erste Element wollen, versuchen Sie dies: b = (a-set()).pop()

-4voto

Solomon Ucko Punkte 3858

Et si s.copy().pop() ? Ich habe es nicht ausprobiert, aber es sollte funktionieren und ist einfach. Es funktioniert jedoch am besten bei kleinen Sets, da es das ganze Set kopiert.

-8voto

Pat Notz Punkte 196406

Eine andere Möglichkeit ist die Verwendung eines Wörterbuchs mit Werten, die Ihnen egal sind. z.B.,

poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
...

Sie können die Schlüssel wie eine Menge behandeln, nur dass sie eben ein Array sind:

keys = poor_man_set.keys()
print "Some key = %s" % keys[0]

Ein Nebeneffekt dieser Wahl ist, dass Ihr Code rückwärtskompatibel mit älteren, vor set Versionen von Python. Es ist vielleicht nicht die beste Antwort, aber es ist eine weitere Option.

Bearbeiten: Sie können sogar so etwas tun, um die Tatsache zu verbergen, dass Sie ein Diktat anstelle eines Arrays oder Sets verwendet haben:

poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
poor_man_set = poor_man_set.keys()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X