Вибір, зразок і варіанти для випадкового вибору елементів зі списку в Python.

Бізнес

Функції choice(), sample() і choices() у модулі random стандартної бібліотеки Python можна використовувати для випадкового вибору та отримання елементів зі списку, кортежу, рядка або іншого об’єкта послідовності (випадкова вибірка).

choice() отримує один елемент, sample() і choices() отримує список кількох елементів. sample() – це вилучення, яке не можна відновити, без дублікатів, choices() – витягування, яке можна відновити, з дублікатами.

Тут наведено наступну інформацію.

  • Виберіть один елемент навмання.:random.choice()
  • Вибір кількох елементів випадковим чином (без дублікатів):random.sample()
  • Вибір кількох елементів випадковим чином (з дублікатами):random.choices()
  • Виправте початкове число випадкових чисел

Виберіть один елемент навмання.:random.choice()

За допомогою функції select() випадкового модуля один елемент випадковим чином вибирається зі списку і може бути отриманий.

import random

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

print(random.choice(l))
# 1

Те ж саме стосується кортежів і рядків. У разі рядків вибирається один символ.

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

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

Помилка, якщо в якості аргументу вказано порожній список, кортеж або рядок.

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

Вибір кількох елементів випадковим чином (без дублікатів):random.sample()

За допомогою функції sample() модуля random ви можете отримати кілька елементів у випадковому порядку зі списку. Відсутнє дублювання елементів (вилучення, що не підлягає відновленню).

Перший аргумент – це список, а другий аргумент – кількість елементів, які потрібно отримати. Список повертається.

import random

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

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

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

Якщо для другого аргументу встановлено значення 1, повертається також список з одним елементом; якщо встановлено значення 0, список порожній. Якщо другий аргумент дорівнює 1, повертається список з одним елементом; якщо він дорівнює 0, повертається порожній список; якщо перший аргумент більше, ніж кількість елементів у списку, виникає помилка.

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

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

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

Якщо першим аргументом є кортеж або рядок, повертається список.

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

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

Якщо ви хочете повернутися до кортежу або рядка, використовуйте tuple(),join().

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

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

Зауважте, що значення не оцінюється, тому якщо вихідний список або кортеж містить елементи з однаковим значенням, є ймовірність, що буде вибрано те саме значення.

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

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

Якщо ви хочете уникнути дублювання значень, ви можете використовувати set(), щоб перетворити його на набір (тип набору) і витягти лише унікальні елементи, а потім використати sample().

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

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

Вибір кількох елементів випадковим чином (з дублікатами):random.choices()

Функція choices() модуля random дозволяє випадково отримувати кілька елементів зі списку, і на відміну від sample(), вона дозволяє вибирати повторювані елементи.

choices() — функція, додана в Python 3.6. Він недоступний у попередніх версіях.

Аргумент k визначає кількість елементів, які потрібно отримати. Допускається дублювання, тому кількість елементів, які потрібно отримати, може бути більшою за кількість елементів у вихідному списку.

Оскільки k є аргументом лише ключового слова, необхідно вказати ключове слово, наприклад 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]

За замовчуванням значення k дорівнює 1; якщо його пропущено, повертається список з 1 елементом.

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

Вагові коефіцієнти аргументів можна використовувати для визначення ваги (ймовірності), що кожен елемент буде вибрано, а тип елементів у списку може бути int або 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]

Аргумент cum_weights також можна вказати як кумулятивну вагу. cum_weights у наступному прикладі коду еквівалентні першим ваговим значенням вище.

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

За замовчуванням для обох аргументів weights і cum_weights є None, що означає, що кожен елемент вибирається з однаковою ймовірністю.

Якщо довжина (кількість елементів) аргументів ваг або cum_weights відрізняється від вихідного списку, виникає помилка.

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

Також є помилкою вказувати ваги та cum_weights одночасно.

# 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

Поки що ми вказали список як перший аргумент як приклад у прикладі коду, але те саме стосується кортежів і рядків.

Виправте початкове число випадкових чисел

Надаючи довільне ціле число до функції seed() випадкового модуля, початкове число випадкових чисел можна зафіксувати, а генератор випадкових чисел можна ініціалізувати.

Після ініціалізації з тим самим початковим елементом елементи завжди вибираються однаково.

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

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