Frage Wie wähle ich zufällig einen Gegenstand aus einer Liste?


Angenommen, ich habe die folgende Liste:

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

Was ist der einfachste Weg, um ein Objekt zufällig aus dieser Liste zu erhalten?


1298
2017-11-20 18:42


Ursprung


Antworten:


Benutzen random.choice:

import random

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

Verwenden Sie für kryptographisch sichere Zufallswahlen (z. B. zum Generieren einer Passphrase aus einer Wortliste) random.SystemRandom Klasse:

import random

foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

2129
2017-11-20 18:46



Falls Sie auch den Index benötigen:

foo = ['a', 'b', 'c', 'd', 'e']
from random import randrange
random_index = randrange(0,len(foo))
print foo[random_index]

125
2017-09-11 15:31



Wenn Sie mehr als einen Artikel aus einer Liste zufällig auswählen oder einen Artikel aus einem Satz auswählen möchten, empfehle ich die Verwendung random.sample stattdessen.

import random
group_of_items = {1, 2, 3, 4}               # 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 nur ein einzelnes Element aus einer Liste ziehen, ist die Auswahl weniger klobig, da die Verwendung von Beispiel die Syntax hätte random.sample(some_list, 1)[0] Anstatt von random.choice(some_list).

Leider funktioniert die Auswahl nur für eine einzige Ausgabe von Sequenzen (wie Listen oder Tupeln). Obwohl random.choice(tuple(some_set)) kann eine Option sein, um ein einzelnes Objekt aus einem Set zu erhalten.


107
2018-05-27 17:07



Ich schlage ein Skript vor, um zufällig ausgewählte Gegenstände von einer Liste zu entfernen, bis sie leer ist:

Pflegen Sie ein set und entferne 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 Läufe geben 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([])

27
2018-05-13 02:47



Ab Python 3.6 können Sie den secrets Modul, das dem zu bevorzugen ist random Modul für Kryptographie oder Sicherheitsanwendungen.

So drucken Sie ein zufälliges Element aus einer Liste:

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

So drucken Sie einen zufälligen Index:

print(secrets.randbelow(len(foo)))

Für Details, siehe PEP 506.


27
2017-12-05 16:52



Dies ist der Code mit einer Variablen, die den Zufallsindex definiert:

import random

foo = ['a', 'b', 'c', 'd', 'e']
randomindex = random.randint(0,len(foo)-1) 
print (foo[randomindex])
## print (randomindex)

Dies ist der Code ohne die Variable:

import random

foo = ['a', 'b', 'c', 'd', 'e']
print (foo[random.randint(0,len(foo)-1)])

Und das ist der Code auf die kürzeste und klügste Art, es zu tun:

import random

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

(Python 2.7)


7
2018-05-25 14:57



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)

7
2017-11-29 16:40



Wenn Sie den Index brauchen, benutzen 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 macht das gleiche :)


6
2017-12-23 22:06



Wie wähle ich zufällig einen Gegenstand aus einer Liste?

Angenommen, ich habe die folgende Liste:

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

Was ist der einfachste Weg, um ein Objekt zufällig aus dieser Liste zu erhalten?

Wenn Sie nah dran sind wirklich zufälligdann schlage ich vor, a zu verwenden SystemRandom Objekt von der random Modul mit der choice Methode:

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

Und nun:

>>> 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 (das ist eigentlich eine gebundene Methode auf a Random Objekt):

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

Es scheint zufällig, aber es ist tatsächlich nicht, was wir sehen können, wenn wir es wiederholt absetzen:

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

4
2018-06-23 22:22



Wir können dies auch mit Randint machen.

from random import randint
l= ['a','b','c']

def get_rand_element(l):
    if l:
        return l[randint(0,len(l)-1)]
    else:
        return None

get_rand_element(l)

3
2017-08-05 07:28