파이썬 열 기준으로 정렬 질문
조회수 2281회
import operator
def sort_table(table, col):
return sorted(table, key=operator.itemgetter(col))
x = [
[4, 6, 3],
[7, 5, 2],
[1, 3, 8]
]
y = sort_table(x[0:3], 0)
for i in range(3):
for j in range(3):
print x[i][j],'\t',
print('\n')
for i in range(3):
for j in range(3):
print y[i][j],'\t',
print('\n')
x[0][0]=y[0][0]
x[1][0]=y[1][0]
x[2][0]=y[2][0]
print x
결과값이
[[1, 6, 3], [1, 5, 2], [1, 3, 8]]
으로 나오는데
[[1,6,3],[4,5,2],[7,3,8]]
으로 나와야 하는거 아닌가요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
전형적인 shallow copy 문제입니다. x와 y는 서로 연관이 없는 듯 보이지만 사실 x와 y는 참조 관계입니다. 따라서 x를 변경할 경우, y도 그 영향을 받을 수 있으며, 그 반대도 마찬가지입니다.
def sort_table(table, col): return sorted(table, key=operator.itemgetter(col)) x = [ [4, 6, 3], [7, 5, 2], [1, 3, 8] ] y = sort_table(x[0:3], 0) print "original:" print y print "after x[0][0]=y[0][0]:" x[0][0]=y[0][0] print y
실행결과:
original: [[1, 3, 8], [4, 6, 3], [7, 5, 2]] after x[0][0]=y[0][0]: [[1, 3, 8], [1, 6, 3], [7, 5, 2]]
이 코드를 실행하면 감이 잡히실텐데요. x에 값을 변경했을 뿐인데 y[1][0]도 함께 바뀌어 있습니다. 올리신 코드를 실행했을 때
[[1,6,3],[4,5,2],[7,3,8]]
가 나오려면 함수sort_table
를 다음과 같이 바꿔주세요.from copy import deepcopy def sort_table(table, col): return deepcopy(sorted(table, key=operator.itemgetter(col)))
여기서 쓰인 deepcopy 함수는 x와 y의 고리를 끊어 더 이상 참조가 일어나지 않게 막습니다. list를 복사하는 자세한 방법은 파이썬 리스트를 복사하려면 어떻게 해야 되나요? 에서 확인하실 수 있습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력