파이썬 리스트에서 랜덤 배열하고싶습니다.
조회수 4965회
리스트에 1-100 사이의 난수를 100개 저장해서 한 줄에 10개씩 출력하고 싶습니다.
예를 들면
77 82 5 13 91 85 43 22 23 90
.
.
.
33 12 95 35 21 34 68 51 53 9
중간에 ...은 편의상 생략했습니다. 아무튼 이런식으로 1-100 사이의 수를 랜덤으로 10 x 10씩 배열하고 싶습니다. 코드를 계속 수정해봤는데도 잘 모르겠네요. 일단 마지막에 쓴 코드는 이렇습니다.
import random
mynum = []
for i in range(100):
k = random.randint(1, 100)
while True:
k = random.randrange(1, 101)
if k not in mynum:
break
mynum.append(k)
for i in range(len(mynum)):
print("%3d"%i, end=' ')
if i%10 == 9:
print('\n')
파이썬을 시작한지 얼마 안됐기 때문에 되도록 기초적인 기능으로 설명해주시면 감사하겠습니다. 또 여기서 잘못된 부분들이 뭔지 싹 다 알고싶습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
잘했구요. 마지막에 랜덤으로 수집한 숫자들을 나누어 보여주는 부분만 다음과 같이 고치면 됩니다.
for i, n in enumerate(mynum): print("%3d"%n, end=' ') if i%10 == 9: print('\n')
이미 뽑은 걸 다시 뽑지 않기 위해서 뽑기를 다시 무작위로 반복하는데, 현재 100개일 때에는 시간에 문제가 없지만, 훨씬 큰 숫자일 때에는 속도 이슈가 나올 수도 있다고 생각됩니다. 백만이라고 하면요. 한개만 더 뽑아야 할 때, 마지막 뽑힐 수는 정해져 있지만, 위 코드에서는 랜덤함수로 무작위로 다시 뽑아요. 그래서 백만분의 1 확률의 뽑기를 반복해야 합니다. 약 백만번정도 해야 마지막 숫자까지 뽑을 수 있어요.
조금 더 개선하는 방법은, 아직 뽑히지 않은 숫자들은 set 에 넣어놓고 무작위로 하나씩 뽑는 방법이 있을 거구요. 파이썬에서는 리스트나 셋이 주어지면 그 중에서 하나를 뽑아주는 함수도 있습니다.
하지만 이런 유형 문제에서 가장 효율적인 것은 shuffle 이라는 걸 이용하는 겁니다. 화투패섞듯이 순서만 섞는 거에요. random 모듈에 있습니다.
random shuffle
>>> import random >>> l = list(range(1, 101)) >>> l [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] >>> random.shuffle(l) >>> l [61, 77, 64, 3, 83, 22, 100, 98, 60, 47, 79, 9, 46, 97, 45, 56, 58, 30, 71, 37, 4, 86, 68, 67, 27, 72, 31, 17, 29, 16, 70, 65, 24, 99, 76, 50, 92, 12, 95, 2, 25, 21, 88, 39, 23, 1, 96, 8, 93, 33, 63, 91, 7, 32, 36, 87, 42, 14, 80, 34, 66, 10, 62, 85, 73, 74, 40, 6, 41, 48, 28, 13, 53, 52, 35, 57, 38, 89, 69, 43, 26, 81, 44, 19, 82, 18, 55, 90, 75, 54, 15, 49, 20, 11, 51, 84, 5, 59, 94, 78] >>> for i in range(10): print(''.join(map(lambda n:'%3s '%n, l[10*i:10*(i+1)]))) 61 77 64 3 83 22 100 98 60 47 79 9 46 97 45 56 58 30 71 37 4 86 68 67 27 72 31 17 29 16 70 65 24 99 76 50 92 12 95 2 25 21 88 39 23 1 96 8 93 33 63 91 7 32 36 87 42 14 80 34 66 10 62 85 73 74 40 6 41 48 28 13 53 52 35 57 38 89 69 43 26 81 44 19 82 18 55 90 75 54 15 49 20 11 51 84 5 59 94 78
random.choice 로 하나씩 뽑기
>>> l = list(range(1, 101)) >>> r = [] >>> random.choice(l) 37 >>> while l: c = random.choice(l) ## 선택하고 r.append(c) ## 결과리스트에 집어넣고 l.remove(c) ## 원래 리스트에서는 삭제한다 >>> l [] >>> r [65, 32, 15, 2, 45, 47, 11, 98, 97, 42, 36, 87, 40, 35, 55, 65, 12, 96, 74, 91, 48, 21, 54, 3, 1, 75, 16, 77, 82, 68, 67, 44, 51, 89, 90, 57, 20, 29, 85, 34, 63, 81, 27, 23, 28, 46, 49, 25, 66, 22, 69, 80, 70, 86, 59, 73, 19, 31, 71, 37, 62, 61, 72, 99, 60, 43, 84, 39, 52, 78, 17, 14, 64, 18, 13, 5, 4, 83, 93, 53, 92, 26, 33, 95, 76, 24, 30, 88, 56, 8, 9, 94, 58, 41, 50, 38, 6, 7, 100, 10, 79] >>> for i in range(10): print(''.join(map(lambda n:'%3s '%n, r[10*i:10*(i+1)]))) 65 32 15 2 45 47 11 98 97 42 36 87 40 35 55 65 12 96 74 91 48 21 54 3 1 75 16 77 82 68 67 44 51 89 90 57 20 29 85 34 63 81 27 23 28 46 49 25 66 22 69 80 70 86 59 73 19 31 71 37 62 61 72 99 60 43 84 39 52 78 17 14 64 18 13 5 4 83 93 53 92 26 33 95 76 24 30 88 56 8 9 94 58 41 50 38 6 7 100 10
댓글 입력