2차원 배열 변수 넣기 질문..(중복이 안되게끔 코드를 짜고싶어요!)
조회수 1167회
안녕하세요! 파이썬 초보자 입니다.
다름아니라 a
와 같은 배열에 n,s,t,k
값을 변수로
n : 20~28/ s,t,k : 20~27까지 모든 경우의 수를 다 따져서 sys 모듈을 이용하여 Noutput이라는 txt 파일로 출력을 했습니다.
여기서 n,s,t,k가 서로 중복되지 않게 (예를들어 n=20이면 s,t,k != 20이게끔) 코드를 짜고 싶은데 너무 어렵네요. 도와주시면 감사하겠습니다.
제 코드는 다음과 같습니다..
import sys
sys.stdout = open('Noutput.txt','w')
n=0
s=0
t=0
k=0
a=[
[0, 0, 0, 0, 0, 0, 0, n],
[0, 0, 0, 0, 0, 0, 0, s],
[0, 0, 0, 0, 0, 0, 0, t],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, k],
[0, 0, 0, 0, 0, 27],
[0, 0, 0, 0, k+1],
[n, s+1, t+1],
]
for n in range(20,28):
a[0][7] = n
a[7][0] = n
for s in range(20,27):
a[1][7] = s
a[7][1] = s+1
for t in range(20,27):
a[2][7] = t
a[7][2] = t+1
for k in range(20,27):
a[4][6] = k
a[6][4] = k+1
for i in a:
for j in i:
print(j,end=' ')
print()
sys.stdout.close()
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
itertools의 permutations 을 사용하면 될 것 같습니다.
간단한 예를 들어보면, 20, 21, 22 중에서 2개씩을 뽑아서 각각 n, s 라고 한다고 합시다. 이걸 itertools permutations 를 이용해서 하면 다음과 같습니다.
from itertools import permutations for a, b in permutations([20, 21, 22], 2): print(a, b)
결과
20 21 20 22 21 20 21 22 22 20 22 21
이제 원하는 건, [20, ..., 28] 중에서 4개씩을 뽑아서, n, s, t, k 로 하면 됩니다. 단, s, t, k 가 28인 경우는 그냥 넘어가게 하면 됩니다.
from itertools import permutations f = open('noutput.txt', 'w') for n, s, t, k in permutations(range(20, 29), 4): if 28 in (s, t, k): continue a = build_data(n, s, t, k) write_data(f, a) f.close()
OK?
위 코드에서 사용된
build_data
와write_data
는 다음과 같습니다.def build_data(n, s, t, k): return [ [0, 0, 0, 0, 0, 0, 0, n], [0, 0, 0, 0, 0, 0, 0, s], [0, 0, 0, 0, 0, 0, 0, t], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, k], [0, 0, 0, 0, 0, 27], [0, 0, 0, 0, k+1], [n, s+1, t+1], ] def write_data(f, a): for l in a: f.write(' '.join(str(n) for n in l) + '\n')
댓글 입력