python: wie Sie wissen, der index, wenn Sie nach dem Zufallsprinzip wählen Sie ein element aus einer Sequenz mit random.choice(seq)
Ich weiß sehr gut, wie zu wählen Sie ein zufälliges Element aus einer Liste mit random.choice(seq)
aber wie erkenne ich den index dieses Elements?
- Eine andere Möglichkeit wäre, wählen Sie den index nach dem Zufallsprinzip und dann Zugriff auf die Sequenz, die durch den index.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie zuerst wählen Sie einen zufälligen index, dann bekommen Sie die Liste element an dieser Position haben, sowohl im index als auch Wert.
Eleganteste Weg, dies zu tun ist, zufällig.randrange:
Kann man dies auch tun in Python ist3, weniger elegant (aber immer noch besser als
.index
) mit zufällig.Wahl auf eine Bereich Objekt:Nur die gültigen Lösungen sind, die diese Lösung und die
random.randint
Lösungen.Diejenigen, die die Verwendung
list.index
sind nicht nur langsam (O(N)
pro lookup anstattO(1)
; wird wirklich schlecht, wenn Sie tun Sie dies für jedes element, die Sie haben zu tunO(N^2)
Vergleiche), aber AUCH Sie werden verzerrt haben/falsche Ergebnisse, wenn die Listen-Elemente sind nicht eindeutig.Man würde denken, dass dies ist langsam, aber es stellt sich heraus, dass Sie nur etwas langsamer als die anderen und die richtige Lösung
random.randint
, und kann mehr lesbar. Ich persönlich halte es für eleganter, weil man nicht zu tun haben numerische index hantieren und unnötigen Parametern wie einem zu tun hat mitrandint(0,len(...)-1)
, aber manche betrachten das ein feature, aber man muss wissen, dierandint
- Konvention ein Inklusives Angebot[start, stop]
.Nachweis der speed für random.Wahl: Der einzige Grund, warum dies funktioniert, ist, dass die
range
- Objekt ist OPTIMIERT für die Indizierung. Als Beweis, die Sie tun könnenrandom.choice(range(10**12))
; wenn es iteriert über die gesamte Liste Ihre Maschine verlangsamt auf ein Schneckentempo.edit: ich hatte übersehen randrange weil die docs schien zu sagen: "diese Funktion nicht nutzen" (aber eigentlich "diese Funktion ist pythonic, es nutzen"). Dank martineau für den Hinweis.
Natürlich könnten Sie Abstrakt das in eine Funktion:
randint
?randrange(len(MY_LIST))
vielleicht noch eleganter, dann (keine Notwendigkeit für-1
oder separaterange()
) -- weiß nicht, über die Geschwindigkeit, obwohl (weil ich nicht Py3 installiert) aber den 2,7 docs sagen, es muss nicht tatsächlich zu bauen, ein range-Objekt.randrange
version. Ich interpretierte die docs bedeuten, es ist besser alschoice(range(start, stop, step))
denn ist es nicht eigentlich bauen einrange
Objekt. In der 3.2 docs gibt es einen Hinweis, dassrandint(a, b)
ist nur ein alias fürrandrange(a, b+1)
die scheint auch zu implizieren, die Sie bevorzugen.Kann man es mit randrange Funktion von random Modul
Wenn die Werte eindeutig sind, in der Reihenfolge, Sie können immer sagen:
list.index(value)
O(N^2)
und gibt eine sehr verzerrte/falsche Ergebnisse, wenn ein Wert wiederholt.Mit randrage() als vorgeschlagen wurde, ist ein guter Weg, um den index. Durch die Erstellung eines Lexikons erstellt über Verständnis verringern kann man diesen code auf eine Zeile, wie unten gezeigt. Bitte beachten Sie, dass dieses Wörterbuch nur ein element hat, wenn Sie Sie nennen popitem() profitieren Sie von der Kombination index und Wert in einem Tupel.