완전한 제거

list1=[[1,3,5] , [9,7,6] , [11,2,12]]

위의 리스트에서 각각의 원소의 마지막 자리가 10보다 큰 원소만 남겨서 list1에 저장한다

저장후, list1을 출력한다






















import implements
list1 = [[1,3,5][9,7,6][11,2,12]]
for i in list1:
	if i[2]<10:
    	list1.remove(i)
print(list1)
<출력>
[[9,7,6],[11,2,12]]
결과가 이와 같이 나온 이유:


1. for문을 처음 통과할 때, i가 list[0]를 가리키면 if 조건에 의해 list1.remove(i)가 실행된다.


2. 이후 다시 for문으로 가는 과정에서 list1에서 1)의 과정에 의하여 [1,3,5]가 사라졌음을 알수 있다. 여기까지는 괜찮았다,,


3. 다시 한번 for문을 실행하는데, 2)의 과정이후 iterable이 바뀐것을 알 수 있다. 특이하게도 컴퓨터는 iterable이 변했음에도 i에 list[0]값을 대입했던 기억이 남아있는지, i에는 list[1]값부터 담기기 시작한다. 이부분에서 문제가 발생한다. [9,7,6]은 i가 list[0]값을 건너띔에 의해 제거되지 않는다. 해결해야할 부분은 list가 변하더라도 for문에서 i가 바뀐 list값을 처음부터 대입시켜야 한다는것이다.

그렇기 위해서 for문의 iterable자리의 구체적인 표현이 필요하다❕❕

list1 = [[1,3,5][9,7,6][11,2,12]]
for i in list1[:]:
	if i[2]<10:
    	list1.remove(i)
print(list1)
[11,2,12]

list1: 을 list1[:]: 로 바꿔주며 인덱싱을 해주었다.
[:]는 첫 원소부터 끝 원소까지의 배열을 나타내는 리스트를 말한다.
이에 따라, 바뀐 list1 에 대해서도 i에 첫 원소부터 대입할 수 있다.

좋은 웹페이지 즐겨찾기