Hoe kan ik willekeurig een item uit een lijst selecteren?

Stel dat ik de volgende lijst heb:

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

Wat is de eenvoudigste manier om willekeurig een item uit deze lijst te halen?


Antwoord 1, autoriteit 100%

Gebruik random.choice():

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

Voor cryptografisch veiligewillekeurige keuzes (bijv. voor het genereren van een wachtwoord uit een woordenlijst), gebruik secrets.choice():

import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))

secretsis nieuw in Python 3.6. Op oudere versies van Python kunt u de random.SystemRandomklas:

import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

Antwoord 2, autoriteit 8%

Als je willekeurig meer dan één item uit een lijst wilt selecteren, of een item uit een set wilt selecteren, raad ik aan om in plaats daarvan random.samplete gebruiken.

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] 

Als je echter maar één item uit een lijst haalt, is de keuze minder onhandig, omdat het gebruik van voorbeeld de syntaxis random.sample(some_list, 1)[0]zou hebben in plaats van random.choice(some_list).

Helaas werkt de keuze echter alleen voor een enkele uitvoer van reeksen (zoals lijsten of tupels). Hoewel random.choice(tuple(some_set))een optie kan zijn om een enkel item uit een set te halen.

EDIT: Geheimen gebruiken

Zoals velen hebben opgemerkt, moet je de geheimen-module gebruiken als je veiligere pseudo-willekeurige voorbeelden nodig hebt:

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]

BEWERK: Pythonic One-Liner

Als je een meer pythonische oneliner wilt voor het selecteren van meerdere items, kun je uitpakken gebruiken.

import random
first_random_item, second_random_item = random.sample({'a', 'b', 'c', 'd', 'e'}, 2)

Antwoord 3, autoriteit 6%

Als je de index ook nodig hebt, gebruik dan random.randrange

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

Antwoord 4, autoriteit 2%

Vanaf Python 3.6 kun je de secretsmodule, die de voorkeur verdient boven de Randommodule voor cryptografie of beveiligingstoepassingen.

Om een willekeurig element uit een lijst af te drukken:

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

Een willekeurige index afdrukken:

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

Zie PEP 506voor meer informatie.


Antwoord 5

Ik stel een script voor om willekeurig opgehaalde items van een lijst te verwijderen totdat deze leeg is:

Behoud een seten verwijder willekeurig opgepikte elementen (met choice) totdat de lijst leeg is.

s=set(range(1,6))
import random
while len(s)>0:
  s.remove(random.choice(list(s)))
  print(s)

Drie runs geven drie verschillende antwoorden:

>>> 
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([])

Antwoord 6

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)

Antwoord 7

NumPy-oplossing: numpy.random.choice

Voor deze vraag werkt het hetzelfde als het geaccepteerde antwoord (import random; random.choice()), maar ik heb het toegevoegd omdat de programmeur NumPy mogelijk al heeft geïmporteerd (zoals ik)

En er zijn ook enkele verschillen tussen de twee methodendie betrekking kunnen hebben op uw daadwerkelijke gebruik.

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

Voor reproduceerbaarheid kunt u het volgende doen:

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

Voor voorbeelden van een of meer items, geretourneerd als een array, geeft u het argument sizedoor:

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

Antwoord 8

Hoe kan ik willekeurig een item uit een lijst selecteren?

Stel dat ik de volgende lijst heb:

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

Wat is de eenvoudigste manier om willekeurig een item uit deze lijst te halen?

Als je dichtbijbij echt willekeurigwilt, dan raad ik secrets.choiceaan uit de standaardbibliotheek (nieuw in Python 3.6.):

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

Het bovenstaande is gelijk aan mijn eerdere aanbeveling, met behulp van een SystemRandomobject uit de Randommodule met de choicemethode – eerder beschikbaar in Python 2:

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

En nu:

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

Als je een deterministische pseudo-willekeurige selectie wilt, gebruik dan de functie choice(wat in feite een gebonden methode is op een Random-object):

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

Het lijkt willekeurig, maar het is eigenlijk niet, wat we kunnen zien als we het herhaaldelijk beieren:

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

Een reactie:

Dit gaat niet over het geval of willekeurige.choice echt willekeurig is of niet. Als u het zaad bevestigt, krijgt u de reproduceerbare resultaten – en dat is waarvoor zaad is ontworpen. Je kunt ook een zaadje naar Systemrandom passeren. sr = random.SystemRandom(42)

Nou ja, ja, je kunt het een “zaad” -argument passeren, maar je zult zien dat de SystemRandomObject negeert het eenvoudig :

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

Antwoord 9

Als u de index nodig hebt, gebruikt u gewoon:

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

Random.Choice doet hetzelfde:)


Antwoord 10

Dit is de code met een variabele die de willekeurige index definieert:

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

Dit is de code zonder de variabele:

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

En dit is de code op de kortste en slimste manier om het te doen:

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

(Python 2.7)


Antwoord 11

Willekeurige itemselectie:

import random
my_list = [1, 2, 3, 4, 5]
num_selections = 2
new_list = random.sample(my_list, num_selections)

Om de volgorde van de lijst te behouden, zou u kunnen doen:

randIndex = random.sample(range(len(my_list)), n_selections)
randIndex.sort()
new_list = [my_list[i] for i in randIndex]

Duplicaat van https://stackoverflow.com/a/49682832/4383027


Antwoord 12

De volgende code laat zien of u dezelfde items moet produceren. U kunt ook specificeren hoeveel monsters u wilt extraheren.
De sampleMethode retourneert een nieuwe lijst met elementen uit de bevolking terwijl de oorspronkelijke bevolking ongewijzigd blijft. De resulterende lijst bevindt zich in de selectieopdracht, zodat alle subplakken ook geldige willekeurige steekproeven zijn.

import random as random
random.seed(0)  # don't use seed function, if you want different results in each run
print(random.sample(foo,3))  # 3 is the number of sample you want to retrieve
Output:['d', 'e', 'a']

Antwoord 13

U kunt gewoon:

from random import randint
foo = ["a", "b", "c", "d", "e"]
print(foo[randint(0,4)])

Antwoord 14

Dit kan al een antwoord zijn, maar u kunt random.shuffle. Voorbeeld:

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

Antwoord 15

We kunnen dit ook doen met behulp van randint.

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)

Other episodes