Erhalten Sie zufällige Stichprobe aus der Liste, während Sie die Bestellung von Artikeln beibehalten?
Ich habe eine sortierte Liste, lassen Sie sagen: (es ist nicht wirklich nur zahlen, die eine Liste von Objekten sortiert werden, mit einem komplizierten, zeitaufwendigen Algorithmus)
mylist = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ,9 , 10 ]
Gibt es eine python-Funktion, die geben mir N Elemente, aber halten Sie die Reihenfolge?
Beispiel:
randomList = getRandom(mylist,4)
# randomList = [ 3 , 6 ,7 , 9 ]
randomList = getRandom(mylist,4)
# randomList = [ 1 , 2 , 4 , 8 ]
etc...
InformationsquelleAutor der Frage Yochai Timmer | 2011-06-26
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende code erzeugt eine zufällige Stichprobe der Größe 4.
Erklärung:
generiert eine zufällige Stichprobe von der Indizes der ursprünglichen Liste.
Diese Probe wird sortiert, um die Erhaltung der Reihenfolge der Elemente in der ursprünglichen Liste.
Schließlich die Liste Verständnis zieht die Elemente aus der ursprünglichen Liste, da die in die Stichprobe einbezogenen Indizes, und erstellt die endgültige Stichprobe (der tatsächlichen Elemente).
InformationsquelleAutor der Antwort mhyfritz
Einfach-zu-code-O(N + K*log(K)) Weg
Nehmen Sie eine Stichprobe ohne Ersetzung der Indizes Sortieren der Indizes, und nehmen Sie Sie aus dem original.
Oder prägnanter:
Optimiert O(N) Zeit, O(1)-Hilfs-Platz Weg
Können Sie alternativ auch eine Mathe-trick und iterativ Durchlaufen
myList
von Links nach rechts, mit der Auswahl der zahlen mit sich dynamisch verändernden Wahrscheinlichkeit(N-numbersPicked)/(total-numbersVisited)
. Der Vorteil dieses Ansatzes ist, dass es einO(N)
Algorithmus, da es sich nicht um die Sortierung!Proof-of-concept-und test, die Wahrscheinlichkeiten richtig sind:
Simuliert mit 1 Billion Pseudo-zufälligen Muster, die im Laufe von 5 Stunden:
Wahrscheinlichkeiten abweichen von den wahren Wahrscheinlichkeiten weniger ein Faktor 1.0001. Läuft dieser test führte erneut zu einer anderen Reihenfolge, was bedeutet, es ist nicht voreingenommen gegenüber einer Bestellung. Test mit weniger Proben für
[0,1,2,3,4], k=3
und[0,1,2,3,4,5], k=4
hatte ähnliche Ergebnisse.edit: Nicht sicher, warum die Leute abstimmen falsch Kommentare oder Angst zu upvote... NEIN, es ist nichts falsch mit dieser Methode. =)
(Auch ein nützlicher Hinweis von Benutzer tegan in die Kommentare: Wenn Sie diese python2 Sie verwenden möchten, xrange, wie üblich, wenn Sie wirklich über zusätzlichen Platz.)
Bearbeiten: Beweis: betrachtet man die gleichmäßige Verteilung (ohne Ersatz) zur Auswahl einer Teilmenge von
k
aus einer Bevölkerungseq
Größelen(seq)
können wir betrachten eine partition an einen beliebigen Punkti
in 'linken' (0,1,...,i-1) und 'rechten' (i,i+1,...,len(seq)). Da holten wirnumbersPicked
von der linken bekannt Teilmenge, die übrigen müssen aus der gleichen gleichmäßige Verteilung auf die Recht unbekannte Teilmenge, obwohl die Parameter sind jetzt anders. Insbesondere die Wahrscheinlichkeit, dassseq[i]
enthält eine gewählte element#remainingToChoose/#remainingToChooseFrom
oder(k-numbersPicked)/(len(seq)-i)
so simulieren wir, und recurse auf das Ergebnis. (Muss Abbrechen, da wenn #remainingToChoose == #remainingToChooseFrom, dann alle restlichen Wahrscheinlichkeiten sind 1.) Das ist vergleichbar mit einer Wahrscheinlichkeit Baum, die passiert werden dynamisch generiert. Grundsätzlich können Sie simulieren eine gleichmäßige Wahrscheinlichkeitsverteilung, die durch Klimaanlage auf Vorherige Entscheidungen (wie Sie wachsen, die Wahrscheinlichkeit, Baum, Holen Sie die Wahrscheinlichkeit, dass der aktuelle Zweig, so dass es aposteriori der gleiche wie vor verlässt, d.h. Zugriff auf Vorherige Entscheidungen; dies wird funktionieren, weil diese Wahrscheinlichkeit ist einheitlich genau N/k).Bearbeiten: Timothy Shields erwähnt Reservoir Samplingdas ist die Verallgemeinerung dieser Methode, wenn Sie
len(seq)
ist unbekannt (wie bei einem generator-Ausdruck). Speziell der eine notiert als "Algorithmus R" ist O(N) und O(1) Speicherplatz, wenn in-place, es bedeutet, dass man die ersten N-element und langsam, Sie zu ersetzen (ein Hinweis auf eine induktive Beweis wird auch gegeben). Es gibt auch nützliche Varianten verteilt und verschiedene Varianten von reservoir-sampling finden Sie auf der wikipedia-Seite.Bearbeiten: Hier ist ein weiterer Weg, um code unten in eine mehr semantisch naheliegender Weise.
)
InformationsquelleAutor der Antwort ninjagecko
Vielleicht können Sie nur erzeugen die Probe der Indizes und dann sammeln Sie die Elemente aus Ihrer Liste.
InformationsquelleAutor der Antwort Howard
Offenbar
random.sample
wurde in python 2.3also für die version, die unter, die wir verwenden können shuffle (Beispiel für 4 items):
InformationsquelleAutor der Antwort Yochai Timmer
zufällig.Beispiel umzusetzen.
InformationsquelleAutor der Antwort xiao