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 Beispielnext(iter({3,2,1}))
gibt immer zurück1
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).
1 Stimmen
@hlin117 Denn Set ist ein unsortierte Sammlung . Da keine Reihenfolge erwartet wird, macht es keinen Sinn, ein Element an einer bestimmten Position abzurufen - es wird erwartet, dass es zufällig ist.
2 Stimmen
@hlin117 Warum macht das dann keinen Sinn? Es heißt "Zeichnen mit Ersatz"...
0 Stimmen
Ich denke, das Problem ist, dass die Werte nicht nach dem Zufallsprinzip zurückgegeben werden und sie nicht den Eindruck erwecken wollen, dass dies der Fall ist. Wahrscheinlich wäre die echte Zufälligkeit ein zu großer Aufwand. Aber für Testzwecke wäre es dennoch einfach, einige
.get()
Funktion oder so...1 Stimmen
B = (a-set()).pop()
0 Stimmen
@Necho: I Liebe diese!!! Könnte man auch einfach machen:
set(a).pop()
?1 Stimmen
@DarenThomas Ich bin kein Experte für Python. Was ich weiß, ist, dass die Zeitkomplexität bei der Verwendung von set(a) O(len(a)) ist, also das Gleiche wie bei copy(). Im Falle der Differenz s-t ist die Zeitkomplexität O(len(t)), was in meinem Beispiel Null ist, aber vielleicht erzeugt die Operation (...).pop() intern eine Kopie, ich weiß es nicht. Das ist etwas, das uns ein Experte sagen könnte :)
4 Stimmen
Ein sinnvoller Anwendungsfall, auf den ich immer wieder stoße, ist dieser: Ich schreibe einen Test und erhalte eine Menge. Ich möchte jeden Wert darin betrachten, um weitere Daten für den Test zu erstellen. Es ist mir egal, welchen Wert ich erhalte, und es ist mir auch egal, ob es jedes Mal derselbe oder ein anderer ist. Ich brauche nur a Wert aus der Menge.