Python에서 목록의 요소 섞기

사업

Python에서 목록(배열)의 요소를 셔플(무작위 정렬)하려면 표준 라이브러리의 random 모듈을 사용하십시오.

원래 목록을 무작위로 정렬하는 shuffle()과 무작위로 정렬된 새 목록을 반환하는 sample()의 두 가지 함수가 있습니다. sample()은 문자열과 튜플에 사용할 수 있습니다.

  • 원본 목록 셔플:random.shuffle()
  • 새로운 셔플 목록을 생성합니다.:random.sample()
  • 문자열과 튜플 섞기
  • 난수 시드 수정

무작위가 아닌 오름차순 또는 내림차순으로 정렬하거나 역순으로 정렬하려면 다음 문서를 참조하세요.

원본 목록 셔플:random.shuffle()

random 모듈의 shuffle() 함수는 원본 목록을 무작위로 정렬할 수 있습니다.

import random

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

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

새로운 셔플 목록을 생성합니다.:random.sample()

random 모듈의 함수 sample()은 원래 목록을 변경하지 않고 무작위로 정렬된 새 목록을 만드는 데 사용할 수 있습니다.

sample()은 목록에서 요소를 무작위로 선택하고 검색하는 함수입니다. 첫 번째 인수는 목록이고 두 번째 인수는 검색할 요소의 수입니다. 자세한 내용은 다음 문서를 참조하세요.

sample()에 의해 선택되는 요소의 수가 목록의 총 요소 수인 경우 모든 요소가 무작위로 정렬된 새 목록을 얻습니다. 목록의 총 요소 수는 len()에 의해 얻습니다.

원래 개체는 변경되지 않습니다.

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

lr = random.sample(l, len(l))
print(lr)
# [0, 3, 1, 4, 2]

print(l)
# [0, 1, 2, 3, 4]

문자열과 튜플 섞기

문자열과 튜플은 변경할 수 없으므로 random.shuffle()을 사용하여 원본 객체를 변경하면 다음 오류가 발생합니다.
TypeError

s = 'abcde'

# random.shuffle(s)
# TypeError: 'str' object does not support item assignment

t = tuple(range(5))
print(t)
# (0, 1, 2, 3, 4)

# random.shuffle(t)
# TypeError: 'tuple' object does not support item assignment

문자열이나 튜플을 섞고 싶다면 random.sample()을 사용하여 새 객체를 만듭니다.

문자열이나 튜플을 인수로 지정하더라도 random.sample()은 목록을 반환하므로 이를 다시 문자열이나 튜플로 처리해야 합니다.

문자열의 경우 문자를 하나씩 나열합니다. 그것들을 다시 하나의 문자열로 연결하려면 join() 메서드를 사용하십시오.

sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca

튜플의 경우 목록에서 튜플을 생성하는 tuple()을 사용합니다.

tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)

난수 시드 수정

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

동일한 시드로 초기화한 후에는 항상 동일한 방식으로 재정렬됩니다.

l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]

l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]