Val, urval och val för att slumpmässigt välja element från en lista i Python.

Företag

Funktionerna choice(), sample() och choices() i random-modulen i Pythons standardbibliotek kan användas för att slumpmässigt välja och hämta element från en lista, tupel, sträng eller annat sekvensobjekt (slumpmässig provtagning).

choice() hämtar ett enda element, sample() och choices() hämtar en lista med flera element. sample() är ett utdrag som inte kan återställas utan dubbletter, choices() är ett utdrag som kan återställas med dubbletter.

Här finns följande information.

  • Välj ett element slumpmässigt.: random.choice()
  • Slumpmässigt välja flera element (inga dubbletter): random.sample()
  • Slumpmässigt välja flera element (med dubbletter): random.choices()
  • Fastställa fröet för det slumpmässiga numret

Välj ett element slumpmässigt.: random.choice()

Med random-modulens funktion choose() väljs ett element slumpmässigt ut från listan och kan hämtas.

import random

l = [0, 1, 2, 3, 4]

print(random.choice(l))
# 1

Samma sak gäller för tupler och strängar. När det gäller strängar väljs ett enda tecken.

print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy

print(random.choice('abcde'))
# b

Fel om en tom lista, tupel eller sträng anges som argument.

# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence

Slumpmässigt välja flera element (inga dubbletter): random.sample()

Med funktionen sample() i slumpmodulen kan du slumpmässigt hämta flera element från en lista. Det finns ingen dubblering av element (icke-återvinningsbar extraktion).

Det första argumentet är en lista och det andra argumentet är antalet element som ska hämtas. Listan returneras.

import random

l = [0, 1, 2, 3, 4]

print(random.sample(l, 3))
# [2, 4, 0]

print(type(random.sample(l, 3)))
# <class 'list'>

Om det andra argumentet är satt till 1 returneras också en lista med ett element; om det är satt till 0 är listan tom. Om det andra argumentet är 1 returneras en lista med ett element; om det är 0 returneras en tom lista; om det första argumentet är mer än antalet element i listan uppstår ett fel.

print(random.sample(l, 1))
# [3]

print(random.sample(l, 0))
# []

# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative

Om det första argumentet är en tupel eller en sträng är det som returneras fortfarande en lista.

print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']

print(random.sample('abcde', 2))
# ['b', 'e']

Om du vill återgå till en tupel eller sträng använder du tuple(),join().

print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')

print(''.join(random.sample('abcde', 2)))
# dc

Observera att värdet inte bedöms, så om den ursprungliga listan eller tupeln innehåller element med samma värde finns det en möjlighet att samma värde väljs.

l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

print(random.sample(l_dup, 3))
# [3, 1, 1]

Om du vill undvika dubbla värden kan du använda set() för att omvandla den till en uppsättning (typ set) och endast extrahera de unika elementen och sedan använda sample().

print(set(l_dup))
# {0, 1, 2, 3}

print(random.sample(set(l_dup), 3))
# [1, 3, 2]

Slumpmässigt välja flera element (med dubbletter): random.choices()

Random-modulens funktion choices() gör det möjligt att hämta flera element slumpmässigt från en lista, och till skillnad från sample() tillåter den att dubbla element väljs ut.

choices() är en funktion som lades till i Python 3.6. Den finns inte i tidigare versioner.

Argumentet k anger antalet element som ska hämtas. Duplicering är tillåten, så antalet element som ska hämtas kan vara större än antalet element i den ursprungliga listan.

Eftersom k är ett argument som endast innehåller nyckelord måste du ange ett nyckelord, t.ex. k=3.

import random

l = [0, 1, 2, 3, 4]

print(random.choices(l, k=3))
# [2, 1, 0]

print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]

Standardvärdet för k är 1. Om det utelämnas returneras en lista med 1 element.

print(random.choices(l))
# [1]

Argumentet weights kan användas för att ange vikten (sannolikheten) för att varje element ska väljas, och typen av element i listan kan vara int eller float.

print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]

print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]

Argumentet cum_weights kan också anges som en kumulativ vikt. Cum_weights i följande exempelkod motsvarar de första vikterna ovan.

print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]

Standardvärdet för både argumenten weights och cum_weights är None, vilket innebär att varje element väljs med samma sannolikhet.

Om längden (antalet element) för argumentet weights eller cum_weights skiljer sig från den ursprungliga listan uppstår ett fel.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_

Det är också ett fel att ange weights och cum_weights samtidigt.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights

Vi har angett en lista som första argument i exempelkoden hittills, men samma sak gäller för tupler och strängar.

Fastställa fröet för det slumpmässiga numret

Genom att ge ett godtyckligt heltal till random-modulens funktion seed() kan slumptalsfröet fastställas och slumptalsgeneratorn initialiseras.

Efter initialisering med samma frö, väljs elementen alltid ut på samma sätt.

random.seed(0)
print(random.choice(l))
# 3

random.seed(0)
print(random.choice(l))
# 3