파이썬 리스트에서 0이 들어간 값을 제거하려고 하는데
조회수 1711회
for i in range(10,100):
list_2.append(i)
for i in range(100,1000):
list_3.append(i)
for i in list_2:
str1 = str(i)
for j in range(2):
if int(str1[j]) == 0:
list_2.remove(i)
for i in list_3:
str2 = str(i)
for j in range(3):
if int(str2[j]) == 0:
list_3.remove(i)
2자리수 리스트와 3자리수 리스트를 만들고 거기서 0이 들어간 10,20,100,200등을 삭제하려고 하는데 2자리수 리스트는 정상적으로 삭제가 되는데 왜 3자리수 리스트에서는 list_3.remove(i)에서 i not in list 에러가 뜰까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
3 답변
-
for i in list_3: str2 = str(i) for j in range(3): if int(str2[j]) == 0: list_3.remove(i) break
2번째 list_3 로직을 보면 100(이하 list_3[0])이 들어왔다고 가정하면
1 > 0이 아님 if문 안거침
0 > 0이므로 list_3[0] 삭제.
0 > 0이므로 list_3[0] 삭제. (이미.. list_3[0] 은 없으므로 에러발생)
그러므로
1 > 0이 아님 if문 안거침
0 > 0이므로 list_3[0] 삭제. break
하셔야 합니다.
-
좀 개선해 보자면,
for i in list_2: str1 = str(i) #for j in range(2): # if int(str1[j]) == 0: # list_2.remove(i) if "0" in str1: list_2.remove(i)
더 개선을 해본다면,
list_2 = [ e for e in list_2 if "0" not in str(e) ]
-
파티가 끝난거 같긴 한데 수학적으로 풀어보는 방법도 있긴 합니다.
import math # 기본 아이디어: 2070 % 100 == 70 == 2070 % 1000 # 이 경우는 셋째 자리 수가 0이기 때문에 참이 된다. def has_zero(num) : # 10, 100, 1000... 으로 나눗셈하면서 앞전에 나온 나머지와 지금 나온 나머지가 같은지 본다. lastMOD = 0 unit = 10; while num >= unit : thisMOD = num % unit if thisMOD == lastMOD : return True lastMOD = thisMOD unit = unit * 10; return False # 놀랍게도 작동을 합니다. print(has_zero(10)) print(has_zero(207)) print(has_zero(6000)) print(has_zero(70060)) print(has_zero(77767))
댓글 입력