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?

3352voto

Pēteris Caune Punkte 41322

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))

277voto

Paul Punkte 3254

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)

189voto

Juan Pablo Rinaldi Punkte 3194

Wenn Sie auch den Index benötigen, verwenden Sie random.randrange

from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])

60voto

Chris_Rands Punkte 34669

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 .

45voto

kiriloff Punkte 24291

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.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