python pop() 질문
조회수 653회
def count(inteval):
co = 0
for num in inteval:
if inteval.pop() <= time_of_del:
co = co + 1
else: pass
return co
inteval
은 [6, 5, 1, 1, 1]
, time_of_del
은 5
입니다
답이 왜 3이 나오죠? 4가 나오도록 만든건데...
1 답변
-
1. 잘 모르겠으면 일단 로그를 잔뜩 찍어봅니다.
def count(inteval): co = 0 for num in inteval: print "----------" print "--> inteval ", inteval print "num: ", num popped = inteval.pop() print "popped: ", popped if popped <= 5: print "co + 1 !!" co = co + 1 print "co: ", co else: print "pass" print "<-- inteval ", inteval print "----------" print co return co count([6, 5, 1, 1, 1])
결과가 이렇게 나옵니다.
---------- --> inteval [6, 5, 1, 1, 1] num: 6 popped: 1 co + 1 !! co: 1 <-- inteval [6, 5, 1, 1] ---------- --> inteval [6, 5, 1, 1] num: 5 popped: 1 co + 1 !! co: 2 <-- inteval [6, 5, 1] ---------- --> inteval [6, 5, 1] num: 1 popped: 1 co + 1 !! co: 3 <-- inteval [6, 5] ---------- 3
다른 건 모르겠고 일단 뭐 하나는 확실히 이상합니다. 뭐여?? 왜
inteval
이 점점 짧아지지 ??
2. 내가 알고 있던 게 부정당하는 기분이 들면 공식문서(또는 믿을 만한 강좌)를 열어서 토씨 하나 놓치지 말고 다시 잘 읽도록 합니다.
pop()은 리스트의 맨 마지막 요소를 돌려주고 그 요소는 삭제한다.
따라서 이 코드는 정상 작동을 하고 있는 겁니다.
co: 3
이후에 순회되는for
문은for 1 in [6, 5]:
를 검증할 텐데요,[6, 5]
에1
이 없는데 어떻게 이for
블록이 실행되겠어요. 따라서 이for
루프는 여기서 중단이 됩니다. (로그가 찍히다 만 것을 보실 수 있지요.) 따라서inteval
처리를 하다 만 결과로서의3
이 최종 결과가 되는 거구요.
3. 그러면 이 문제는
pop()
을 어떻게 잘 활용하면 될 문제인가? 제 생각에는 그보다는 그냥 아예 접근을 바꿔 보는 것도 방법이 아닌가 합니다. 왜냐하면 만약 원하시는 것이 단지배열과 특정 정수를 입력하면 → 그 배열 원소 중 그 정수보다 크지 않은 원소들의 갯수를 출력
하는 것뿐이라면... 사실 그런 건 파이썬에서는 1줄짜리 코드로 끝나기 때문이죠.
# 핵심 아이디어: 조건에 따라 목록을 filter한다. def count(ints, the_int) : return len(filter(lambda x: int(x) <= the_int, ints)) print count([6,5,1,1,1], 5) # 출력: 4
댓글 입력