K 크기의 리스트를 N개 무작위로 생성해야 하는 경우, 원본 리스트의 값을 섞은(shuffle) 뒤 필요한 만큼 잘라내어 결과를 반환하는 제너레이터 함수를 정의하면 간단하게 해결할 수 있습니다.
예제
아래는 실제 구현 예시입니다.
from random import shuffle
def gen_random_list(my_val, K):
while True:
shuffle(my_val)
yield my_val[:K]
my_list = [12, 45, 76, 32, 45, 88, 99, 0, 1]
print("The list is ")
print(my_list)
K, N = 4, 5
print("The value of K is ")
print(K)
print("The value of N is ")
print(N)
my_result = []
for elem in range(0, N):
my_result.append(next(gen_random_list(my_list, K)))
print("The result is ")
print(my_result)출력
The list is [12, 45, 76, 32, 45, 88, 99, 0, 1] The value of K is 4 The value of N is 5 The result is [[88, 76, 99, 12], [12, 99, 32, 76], [32, 76, 12, 99], [32, 45, 0, 12], [76, 0, 1, 45]]
코드 설명
필요한 패키지(
random.shuffle)를 환경에 임포트합니다.리스트와
K를 매개변수로 받는gen_random_list메서드를 정의합니다.무한 반복문 안에서
shuffle메서드로 리스트 요소의 순서를 무작위로 섞고,yield와 슬라이싱([:K])을 사용해 앞에서부터 K개의 요소를 반환합니다.메서드 외부에서 원본 리스트를 정의하고 콘솔에 출력합니다.
K와 N의 값을 설정한 뒤 콘솔에 표시합니다.
결과를 담을 빈 리스트를 하나 선언합니다.
0부터 N까지 반복하면서
next()로 제너레이터를 호출하여 새로운 무작위 리스트를 얻고, 그 결과를 빈 리스트에 추가(append)합니다.최종 결과 리스트를 콘솔에 출력합니다.
핵심 포인트
shuffle()은 원본 리스트 자체를 제자리(in-place)에서 변경한다는 점에 유의하세요. 또한 yield를 사용했기 때문에 gen_random_list는 일반 함수가 아닌 제너레이터(generator)로 동작합니다. next()를 호출할 때마다 실행이 재개되어 리스트를 다시 섞고 새로운 K 크기의 부분 리스트를 반환하므로, 매번 서로 다른 무작위 조합을 얻을 수 있습니다.