2309 Stimmen

Wie kann ich ein Element zufällig aus einer Liste auswählen?

Angenommen, ich habe die folgende Liste:

foo = ['a', 'b', 'c', 'd', 'e']

Was ist die einfachste Methode, um einen zufälligen Eintrag aus dieser Liste auszuwählen?

35voto

Fardin Abdi Punkte 1110
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

In Python 2:

random_items = random.sample(population=foo, k=number_of_samples)

In Python 3:

random_items = random.choices(population=foo, k=number_of_samples)

29voto

C8H10N4O2 Punkte 16753

NumPy Lösung: numpy.random.choice

Für diese Frage gilt dasselbe wie für die akzeptierte Antwort ( import random; random.choice() ), aber ich habe es hinzugefügt, weil der Programmierer vielleicht schon NumPy importiert hat (wie ich)

Und es gibt auch einige Unterschiede zwischen den beiden Methoden die Ihren konkreten Anwendungsfall betreffen können.

import numpy as np
np.random.choice(foo) # randomly selects a single item

Für die Reproduzierbarkeit, können Sie tun:

np.random.seed(123)
np.random.choice(foo) # first call will always return 'c'

Für Proben von ein oder mehrere Gegenstände , zurückgegeben als array die size Argument:

np.random.choice(foo, 5)          # sample with replacement (default)
np.random.choice(foo, 5, False)   # sample without replacement

21voto

Pratik Thorat Punkte 173

Für die Arbeit mit Listen und Randomisierung verwende ich normalerweise das Modul random

import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))

18voto

Janek Olszak Punkte 3730

Wenn Sie den Index benötigen, verwenden Sie einfach:

import random
foo = ['a', 'b', 'c', 'd', 'e']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]

random.choice tut dasselbe:)

17voto

Wie wählt man zufällig ein Element aus einer Liste aus?

Angenommen, ich habe die folgende Liste:

foo = ['a', 'b', 'c', 'd', 'e']  

Was ist die einfachste Methode, um einen zufälligen Eintrag aus dieser Liste auszuwählen?

Wenn Sie wollen schließen a wirklich zufällig dann schlage ich vor secrets.choice aus der Standardbibliothek (Neu in Python 3.6.):

>>> from secrets import choice         # Python 3 only
>>> choice(list('abcde'))
'c'

Die obige Vorgehensweise entspricht meiner früheren Empfehlung, eine SystemRandom Objekt aus dem random Modul mit dem choice Methode - früher in Python 2 verfügbar:

>>> import random                      # Python 2 compatible
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']

Und jetzt:

>>> sr.choice(foo)
'd'
>>> sr.choice(foo)
'e'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'b'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'c'
>>> sr.choice(foo)
'c'

Wenn Sie eine deterministische Pseudozufallsauswahl wünschen, verwenden Sie die choice Funktion (die eigentlich eine gebundene Methode für eine Random Objekt):

>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>

Es scheint willkürlich zu sein, ist es aber nicht, was wir sehen können, wenn wir es wiederholt neu säen:

>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')

Ein Kommentar:

Hier geht es nicht darum, ob random.choice wirklich zufällig ist oder nicht. Wenn man den Seed festlegt, erhält man reproduzierbare Ergebnisse - und genau dafür ist Seed gedacht. Sie können auch einen Seed an SystemRandom übergeben. sr = random.SystemRandom(42)

Nun, ja, Sie können ihm ein "seed"-Argument übergeben, aber Sie werden sehen, dass die SystemRandom Objekt ignoriert es einfach :

def seed(self, *args, **kwds):
    "Stub method.  Not used for a system random number generator."
    return None

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