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?
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?
Utilice random.choice()
:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Para kryptographisch sicher Zufallsauswahlen (z. B. für die Generierung einer Passphrase aus einer Wortliste), verwenden Sie secrets.choice()
:
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secrets
ist neu in Python 3.6. In älteren Versionen von Python können Sie die random.SystemRandom
Klasse:
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
Wenn Sie nach dem Zufallsprinzip mehr als ein Element aus einer Liste oder ein Element aus einer Menge auswählen möchten, empfehle ich die Verwendung von random.sample
stattdessen.
import random
group_of_items = {'a', 'b', 'c', 'd', 'e'} # a sequence or set will work here.
num_to_select = 2 # set the number to select here.
list_of_random_items = random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
Wenn Sie jedoch nur ein einzelnes Element aus einer Liste abrufen, ist die Auswahl weniger umständlich, da die Verwendung von sample die Syntax random.sample(some_list, 1)[0]
anstelle von random.choice(some_list)
.
Leider funktioniert die Auswahl aber nur für eine einzige Ausgabe von Sequenzen (wie Listen oder Tupel). Obwohl random.choice(tuple(some_set))
kann eine Option sein, um ein einzelnes Element aus einer Menge zu erhalten.
EDIT: Verwendung von Secrets
Wie bereits erwähnt, sollten Sie, wenn Sie sicherere Pseudozufallsmuster benötigen, das secrets-Modul verwenden:
import secrets # imports secure module.
secure_random = secrets.SystemRandom() # creates a secure random object.
group_of_items = {'a', 'b', 'c', 'd', 'e'} # a sequence or set will work here.
num_to_select = 2 # set the number to select here.
list_of_random_items = secure_random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
EDIT: Pythonischer One-Liner
Wenn Sie einen pythonischeren Einzeiler für die Auswahl mehrerer Elemente wünschen, können Sie unpacking verwenden.
import random
first_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2)
Wenn Sie auch den Index benötigen, verwenden Sie random.randrange
from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
Ab Python 3.6 können Sie die secrets
Modul, das dem Modul random
Modul für kryptografische oder sicherheitsrelevante Zwecke.
Um ein zufälliges Element aus einer Liste zu drucken:
import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
Um einen Zufallsindex zu drucken:
print(secrets.randbelow(len(foo)))
Für weitere Informationen siehe PEP 506 .
Ich schlage ein Skript vor, mit dem zufällig ausgewählte Einträge aus einer Liste entfernt werden können, bis diese leer ist:
Aufrechterhaltung einer set
und entfernen Sie ein zufällig ausgewähltes Element (mit choice
), bis die Liste leer ist.
s=set(range(1,6))
import random
while len(s)>0:
s.remove(random.choice(list(s)))
print(s)
Drei Durchläufe ergeben drei verschiedene Antworten:
>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])
>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
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.