Python 리스트 랜덤 추출 choice,sample,choices 사용 방법

파이썬 표준 라이브러리 random 모듈 함수 choice, sample, choices를 사용해 리스트 또는 튜플에서 요소를 랜덤으로 추출하는 방법을 알아보겠습니다.

우선 choice, sample, choices에 대해 간단히 살펴보겠습니다.

  • random.choice – 랜덤으로 요소 하나를 취득.
  • random.sample – 랜덤으로 요소 여러 개 취득. 중복 없음.
  • random.choices – 랜덤으로 요소 여러 개 취득. 중복 있음.

 

random.choice()

choice 함수는 리스트나 튜플에서 요소를 랜덤으로 취득합니다.

샘플을 보겠습니다.

import random

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

print(random.choice(l))

 

결과

2

 

튜플이나 문자열에서도 choice 함수를 사용해 문자를 랜덤 하게 취득할 수 있습니다.

import random

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

print(random.choice('abcde'))

 

결과

yyy
c

 

주의점으로는 공백 리스트나 튜플 또는 문자열에 choice 함수를 사용하면 에러가 발생합니다.

import random

print(random.choice([]))

 

결과

IndexError: Cannot choose from an empty sequence

 

random.sample()

sample 함수는 리스트에서 여러 개 요소를 랜덤으로 취득합니다.

sample로 랜덤 하게 취득한 값은 중복되지 않습니다.

sample(리스트, 취득 개수)

 

sample함수에 첫 번째 파라미터는 추출 대상이 되는 리스트를 지정합니다.

두 번째 파라미터에는 랜덤으로 취득하고 싶은 요소 개수를 지정합니다.

샘플을 보겠습니다.

import random

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

print(random.sample(l, 3))

# 반환값 데이터 타입 확인
print(type(random.sample(l, 3)))

 

결과

[1, 3, 0]
<class 'list'>

 

sample을 사용해 취득한 결과값은 리스트 형태로 반환합니다.

결과값이 없는 경우에도 리스트 형태로 반환을 합니다.

import random

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

print(random.sample(l, 0))

 

결과

[]

 

취득하고 싶은 요소 개수가 추출 대상 리스트 요소수 보다 큰 경우에는 에러가 발생합니다.

import random

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

print(random.sample(l, 10))

 

결과

ValueError: Sample larger than population or is negative

sample 함수에도 튜플이나 문자열을 지정할 수 있습니다.

import random

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

print(random.sample('abcde', 2))

 

결과

['yyy', 'zzz']
['a', 'b']

 

튜플이나 문자열에서 sample 함수를 사용해도 결과값은 리스트 형태로 반환합니다.

원래 형태로 반환 값을 받고 싶은 경우에는 tuple(), join()을 사용합니다.

import random

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

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

 

결과

('zzz', 'yyy')
bd

 

추출 대상 리스트에 중복 값이 있는 경우에도 sample 함수를 사용할 수 있습니다.

import random

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

print(random.sample(l_dup, 3))

 

결과

[2, 3, 2]

sample 함수에 대해 위에서 설명할 때 중복된 값을 취득하지 않는다고 설명했습니다.

하지만 결과를 보면 2가 2번 나왔습니다.

이유는 sample 함수를 사용해 랜덤 하게 요소를 취득하는 경우, 추출 대상 리스트에서 한번 추출한 요소는 다음 추출 대상에서 제외를 시킵니다.

하지만 값이 동일한 요소가 있다면 같은 값을 취득하는 경우가 발생합니다.

중복된 값을 취득하고 싶지 않은 경우에는, 추출 대상 리스트에서 중복된 값을 제거하고 sample을 사용하면 됩니다.

리스트에서 중복된 값을 제거하는 방법은 set()을 사용합니다.

import random

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

print(random.sample(set(l_dup), 3))

 

결과

[0, 3, 1]

 

랜덤으로 취득한 결과를 보면 중복된 값은 취득되지 않았습니다.

리스트에서 중복 제거를 하는 set() 함수 사용 방법은 아래를 참조해주세요.

 

random.choices()

 

choices 함수는 Python3.6부터 사용할 수 있습니다.

이전 버전에서는 사용할 수 없습니다.

choices(리스트, k=취득 개수)

 

choices 함수에 첫 번째 파라미터에는 대상이 되는 리스트를 지정합니다.

두 번째 파라미터에는 랜덤으로 취득하고 싶은 요소 개수를 k에 지정합니다.

import random

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

print(random.choices(l, k=3))

 

결과

[4, 2, 2]

 

choices 함수를 사용해 취득한 결과를 보면 추출 대상 리스트에는 중복된 값을 지정하지 않았지만 중복된 값이 표시되어 있습니다.

sample 함수와는 다르게 choices 함수는 한번 추출한 요소를 제외시키지 않습니다.

그렇기 때문에 추출 대상 리스트의 요소수 보다 랜덤 하게 취득하고 싶은 요소를 크게 지정해도 에러가 발생하지 않습니다.

import random

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

print(random.choices(l, k=10))

 

결과

[4, 2, 3, 2, 2, 2, 2, 4, 1, 1]

 

추출 대상 리스트에는 요소가 5개 있지만 랜덤으로 10개를 추출이 가능합니다.

k를 생략하는 경우에는 기본값으로 1이 지정됩니다.

댓글