리스트 요소 옮기기
리스트 X = [2,3,4,5...9,10] 의 데이터를 하나씩
비어있는 리스트 A = [] 로 옮겨보자.
X=list(range(2,11))
print(X)
A=list()
for x in X:
A.append(x)
X.remove(x)
print("X is ", X)
print("A is ", A)
예상한 결과
X is []
A is [2,3,4,5...9,10]
리스트 홀수 빠짐
A is [2, 4, 6, 8, 10]
X is [3, 5, 7, 9]
리스트A의 요소를 옮기는 건 아무 문제가 없지만, 옮긴 후에 요소를 없앴기 때문이다.
디버깅
0-1. for문을 시작하면 X[0]=2이므로, x=2,
0-2. A에 2를 추가하여 A=[2], X=[2,3,4...10]. 리스트를 프린트해보면 A=[2], X=[3,4,5,6...9,10] 이다.
0-3. X에서 2를 삭제하여 A[0]=2, X[0]=3. 리스트를 프린트해보면 A=[2], X=[3,4,5,6...9,10] 이다..
for 문이 잘 안풀릴 때는 정의로 돌아가서 자세히 읽어보자.
"for 문의 기본구조는 다음과 같다...(생략). 리스트나 튜플, 문자열의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 "수행할 문장1", "수행할 문장2" 등이 수행된다." - 점프투 파이썬 3-3강 for문
for 문은 "요소"(위에서 x)에 대해 반복한다.
리스트 내에서 요소는 [2,3,4,5...9,10]에서 각각의 숫자로, 코드를 작성하며 "2를 A로 넘기고 지우고.. 그 다음이 3이니깐 A로 넘기고 지우고..." 라고 생각하기 쉽다.
하지만 한 가지 중요한 점을 까먹었는데, 리스트는 데이터를 X[0]=2, X[1]=3, X[2]=4... X[8]=10 이런 상태로 저장하며, 앞의 요소가 삭제되면, X[0]=3, X[1]=4... 이런 식으로 앞당기는 거 같다.
for 문이 리스트 내의 데이터에 대해서 동작을 반복할 때,
'X[0] 값인 2를 대입하고 2를 삭제, X[1] 값인 3을 넣고 대입한다.' 고 생각한게 문제였다.
앞선 상황에서는 X[0] 가 2였다가, 세번째 줄에서 X.remove(x) 명령을 내리는 바람에 X[0]=3, X[1]=4, X[2]=5, X[3]6...X[7]=10 이 되어버렸다. 그리고 for문은 X[1]에 대해 반복을 하게되므로, x=4에 대해서 동작을 반복한다.
이렇게 5는 건너뛰고 6에 대해서 동작을 반복...하다보면 X에 홀수가 남고 A로 짝수만 옮겨진다. 리스트가 변형된 것이 원인이다.
해결법은 없는 것 같다. 이렇게 리스트를 옮기지 말아야겠다. "There's no good way to alter a list's length while iterating over it." -stakeflow... 즉, 리스트 길이를 바꾸면서 리스트 옮기기를 반복하는 건 어려운 일이다.
stackoverflow.com/questions/6260089/strange-result-when-removing-item-from-a-list-while-iterating-over-it
'파이썬 공부 > 기초' 카테고리의 다른 글
파이썬 이중콜론 :: 의미 (0) | 2022.06.02 |
---|---|
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_61 sm_70 sm_75 compute_37 에러 (0) | 2022.03.01 |
[python] 알라딘 중고서점 스크래핑-3 (0) | 2021.12.21 |
[python] 알라딘 중고서점 스크래핑-2 (0) | 2021.12.21 |
알라딘 중고서점 가격 스크래핑(파이썬) (0) | 2021.12.21 |