Választás, minta és választások egy lista elemeinek véletlenszerű kiválasztásához Pythonban.

Üzleti

A Python szabványos könyvtár random moduljának choice(), sample() és choices() függvényei arra használhatók, hogy véletlenszerűen válasszunk ki és vegyünk ki elemeket egy listából, tuple-ból, stringből vagy más szekvenciaobjektumból (véletlen mintavétel).

A choice() egyetlen elemet kap, a sample() és a choices() több elemet tartalmazó listát kap. a sample() nem helyreállítható kivonatolás duplikátumok nélkül, a choices() helyreállítható kivonatolás duplikátumokkal.

A következő információk itt találhatók.

  • Válasszon ki véletlenszerűen egy elemet.: random.choice()
  • Több elem véletlenszerű kiválasztása (duplikátumok nélkül): random.sample()
  • Több elem véletlenszerű kiválasztása (duplikátumokkal): random.choices()
  • A véletlen számok magjának rögzítése

Válasszon ki véletlenszerűen egy elemet.: random.choice()

A random modul choose() függvényével egy elemet véletlenszerűen választunk ki a listából, és az lekérdezhető.

import random

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

print(random.choice(l))
# 1

Ugyanez vonatkozik a tuplikra és a karakterláncokra is. A karakterláncok esetében egyetlen karaktert választunk ki.

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

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

Hiba, ha üres lista, tuple vagy string van megadva argumentumként.

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

Több elem véletlenszerű kiválasztása (duplikátumok nélkül): random.sample()

A random modul sample() függvényével véletlenszerűen több elemet kaphatunk egy listából. Az elemek megkettőzése (nem helyreállítható kivonás) nem történik.

Az első argumentum egy lista, a második pedig a lekérdezendő elemek száma. A lista visszaküldésre kerül.

import random

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

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

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

Ha a második argumentum értéke 1, akkor egy egyelemű listát kapunk vissza; ha 0, akkor a lista üres. Ha a második argumentum 1, akkor egy listát kapunk vissza egy elemmel; ha 0, akkor egy üres listát kapunk vissza; ha az első argumentum több, mint a lista elemeinek száma, akkor hiba lép 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

Ha az első argumentum egy tuple vagy egy string, akkor is egy listát kapunk vissza.

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

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

Ha vissza akarsz térni egy tuple-hez vagy stringhez, használd a tuple(),join() parancsot.

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

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

Vegye figyelembe, hogy az értéket nem bírálja el, így ha az eredeti lista vagy tuple azonos értékű elemeket tartalmaz, fennáll a lehetősége, hogy ugyanaz az érték lesz kiválasztva.

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

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

Ha el akarod kerülni a duplikált értékeket, akkor a set() segítségével átalakíthatod halmazzá (set típusú), és csak az egyedi elemeket vonhatod ki, majd használhatod a sample() funkciót.

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

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

Több elem véletlenszerű kiválasztása (duplikátumokkal): random.choices()

A random modul choices() függvénye lehetővé teszi több elem véletlenszerű kiválasztását egy listából, és a sample() függvénytől eltérően lehetővé teszi a duplikált elemek kiválasztását.

A choices() egy, a Python 3.6-ban bevezetett függvény. A korábbi verziókban nem érhető el.

A k argumentum a lekérdezendő elemek számát adja meg. A duplikáció megengedett, így a kinyerendő elemek száma nagyobb lehet, mint az eredeti lista elemeinek száma.

Mivel a k csak kulcsszavas argumentum, meg kell adni egy kulcsszót, például 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]

A k alapértelmezett értéke 1; ha kihagyjuk, akkor egy 1 elemű listát kapunk vissza.

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

A weights argumentummal megadható az egyes elemek kiválasztásának súlya (valószínűsége), a lista elemeinek típusa pedig int vagy float lehet.

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]

A cum_weights argumentum megadható kumulatív súlyként is. A következő példakódban szereplő cum_weights egyenértékű a fenti első súlyokkal.

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

Mind a weights, mind a cum_weights argumentumok alapértelmezett értéke None, ami azt jelenti, hogy minden elem azonos valószínűséggel kerül kiválasztásra.

Ha az argumentum weights vagy cum_weights hossza (elemeinek száma) eltér az eredeti listától, hiba lép 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_

Hiba a súlyok és a cum_weights egyidejű megadása is.

# 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

Az eddigi példakódban példaként egy listát adtunk meg első argumentumként, de ugyanez vonatkozik a tuplikra és a stringekre is.

A véletlen számok magjának rögzítése

A random modul seed() függvényének egy tetszőleges egész szám megadásával rögzíthető a véletlenszám-vetőmag és inicializálható a véletlenszám-generátor.

Az azonos maggal történő inicializálás után az elemek kiválasztása mindig azonos módon történik.

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

random.seed(0)
print(random.choice(l))
# 3
Copied title and URL