Python의 목록에서 요소를 무작위로 선택하기 위한 선택, 샘플 및 선택.

사업

Python 표준 라이브러리의 random 모듈에 있는 choice(), sample() 및 choice() 함수를 사용하여 목록, 튜플, 문자열 또는 기타 시퀀스 객체(무작위 샘플링)에서 요소를 무작위로 선택하고 검색할 수 있습니다.

Choice()는 단일 요소를 가져오고, sample() 및 choice()는 여러 요소의 목록을 가져옵니다. sample()은 중복이 없는 복구 불가능한 추출이고, choice()는 중복이 있는 복구 가능한 추출입니다.

다음 정보가 여기에 제공됩니다.

  • 무작위로 하나의 요소를 선택합니다.:random.choice()
  • 여러 요소를 무작위로 선택(중복 없음):random.sample()
  • 여러 요소를 무작위로 선택(중복 포함):random.choices()
  • 난수 시드 수정

무작위로 하나의 요소를 선택합니다.:random.choice()

random 모듈의 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()

random 모듈의 sample() 함수를 사용하면 목록에서 여러 요소를 무작위로 가져올 수 있습니다. 요소의 중복이 없습니다(복구 불가능한 추출).

첫 번째 인수는 목록이고 두 번째 인수는 검색할 요소의 수입니다. 목록이 반환됩니다.

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()을 사용하여 집합(set type)으로 변환하고 고유한 요소만 추출한 다음 sample()을 사용하면 됩니다.

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

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

여러 요소를 무작위로 선택(중복 포함):random.choices()

random 모듈의 함수 choice()를 사용하면 목록에서 무작위로 여러 요소를 검색할 수 있으며 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]

인수 weights는 각 요소가 선택될 가중치(확률)를 지정하는 데 사용할 수 있으며 목록의 요소 유형은 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이며, 이는 각 요소가 동일한 확률로 선택됨을 의미합니다.

인수 weights 또는 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_

weights와 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

지금까지 샘플 코드에서 예제로 목록을 첫 번째 인수로 지정했지만 튜플과 문자열에도 동일하게 적용됩니다.

난수 시드 수정

random 모듈의 함수 seed()에 임의의 정수를 제공함으로써 난수 시드를 고정하고 난수 생성기를 초기화할 수 있습니다.

동일한 시드로 초기화한 후 요소는 항상 동일한 방식으로 선택됩니다.

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

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