파이썬 초보 리스트 - remove 질문있습니다 삐약 🐥🐤🐣
조회수 1256회
리스트 안의 공통된 숫자를 제거하려고 하는 상황에서
a = [1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7]
for remove_one in a:
a.remove(1)
print(a)
[2, 3, 4, 5, 6, 7]
여기는 1이 다 제거되는데
a = [1, 2, 1, 1, 1, 1, 1, 1, 1, 1]
for remove_one in a:
a.remove(1)
print(a)
[2, 1, 1, 1, 1]
요기선 왜 뒤의 1 몇개가 남아있는걸까요?
1 답변
-
list 에서 remove(value)를 수행하면 value가 여러개 있을 경우, 제일 앞에 있는 value만 삭제 됩니다.
for 문은 list에서 순차적으로 각 원소를 변수에 대입합니다.
for문 은 list의 마지막 원소를 대입한 후 종료합니다.
그런데 위 예시는 정말 실로 절묘한 트릭이군요.. ㅎㅎ list 에 대한 좋은 공부 소재가 될 것 같습니다.
1번 예제
a = [1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7] for remove_one in a: a.remove(1)
위 코드에서 remove_one 에는 (마치, for 1 in a: 같이 보이지만)
- list a의 각 값이
- 각 원소의 위치가 증가하면서
- 대입되게 됩니다.
처음에는 1이 대입되겠죠.
그 1은 remove로 제거 됩니다, list a 에서요
그럼 그 다음 원소(2번째)가 remove_one 에 대입될텐데
첫 번째로 있던 1이 없어 졌으니
두번째 수행 당시에는 a가
[2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7] 이런 식이 될겁니다.
remove_one 에는 두번째 원소인 1이 들어가게 됩니다.
remove(1) 명령이 수행되면
남아 있는 1 중에서 맨 앞의 1이 또 삭제 되고
a는 [2, 3, 1, 4, 1, 5, 1, 6, 1, 7] 이 됩니다.
(remove_one 에는 세번째 원소인 1이 들어가게 됩니다)
이런 식으로 반복되면
뭐, 어쨌거나 list 끝까지 도니까 remove(1)이 계속 수행되어서
결국 a = [2, 3, 4, 5, 6, 7]
이렇게 되지요.
※ a 의 길이는 원래 12였는데, 6으로 줄었습니다. 기억하십시오.
그런데 아래 코드는 또 다릅니다.
2번 예제
a = [1, 2, 1, 1, 1, 1, 1, 1, 1, 1] for remove_one in a: a.remove(1)
위에서 설명 드린 바와 같이 동작할텐데
이번엔 a의 길이가 10 이고, 1 갯수가 9개 입니다.
원래 의도대로 라면 10번 돌아야겠지만
remove 명령에 의해서 a 길이가 자꾸 줄어듭니다.
처음 : [1, 2, 1, 1, 1, 1, 1, 1, 1, 1]
1번째 for문 수행 후 : [2, 1, 1, 1, 1, 1, 1, 1, 1]
2번째 for문 수행 후 :[2, 1, 1, 1, 1, 1, 1, 1]
3번째 for문 수행 후 : [2, 1, 1, 1, 1, 1, 1]
4번째 for문 수행 후 : [2, 1, 1, 1, 1, 1]
5번째 for문 수행 후 : [2, 1, 1, 1, 1]
자, 6번째 remove를 수행할까요? 아니죠. for문은 중단됩니다.
현재, 리스트 a의 크기는 5인데 다음 원소를 가져올 수 없으니까요.
그래서 remove도 5번 수행 후 중단된 것입니다.
약간 미진한듯하여 ...
list 에서 원하는 값들을 모두 제거하기 위한 코드를 추가합니다.
참고하세요 ^
# BMW 를 모두 제거할겁니다. 그냥 for 문 돌리면 위 2번 예시 같은 오류가 발생합니다. carList = ['BMW', 'BENZ', 'BMW', 'BMW', 'BMW', 'BMW', 'BMW', 'BMW', 'AUDI', 'BMW', 'BMW'] # 오류 # for car in carList: # if car == 'BMW': # carList.remove(car) # print(carList) # ['BENZ', 'BMW', 'BMW', 'AUDI', 'BMW', 'BMW'] # 정상 count = carList.count('BMW') for _ in range(count): carList.remove('BMW') print(carList) # ['BENZ', 'AUDI']
- 오왕 구체적인 작동 방식을 알아둬야겠군요..! 😮😮😮 유병근 2021.8.10 01:58
- 이렇게 구체적으로 알려주셔서 감사드립니다! 도움이 많이 됐어요! 😍 유병근 2021.8.10 01:58
- 자, 6번째 remove를 수행할까요? 아니죠. for문은 중단됩니다. 현재, 리스트 a의 크기는 5인데 다음 원소를 가져올 수 없으니까요. 그래서 remove도 5번 수행 후 중단된 것입니다. //// 여기서 리스트 a의 크기가 5 일때, 왜 다음 원소를 가져올 수 없는건가욤?🤔 유병근 2021.8.10 03:36
- for문에서 list 에서 원소를 꺼낼 때 point 가 증가하면서 해당 원소를 선택하게 되는데요, point가 5에서 6으로 증가했는데... 막상 list 길이가 5 밖에 안되서 (remove로 인해 크기가 줄어들었습니다) 더이상 꺼낼 원소가 없기 때문입니다 ^^ whistler7899 2021.8.10 07:30
-
결과를 예상해보세요.. ^^
carList = ['BMW', 'BENZ'] for car in carList: print(car) carList.remove(car)
whistler7899 2021.8.10 07:38 - 아하~! 추가적인 답변 감사드려요 !_!❣ 유병근 2021.8.10 13:13
댓글 입력