2013-08-30 3 views
1

다른 모든 숫자보다 먼저 목록에 나타나는 0의 개수를 알고 싶습니다.for 루프 중에

예 :
L1 = [0, 0, 0, 0, 0, 1, 2] - 출력은 0이어야합니다.
L2 = [1, 0, 0, 0, 0, 0, 2] - 출력이 0이어야합니다.

k = 0 
for i in L1: 
    while i == 0: 
     k = k + 1 

그것은 그래도 작동하지 않습니다이이 목록에있는 5 0을하지만 목록 1.

로 시작하지만 여기 내 코드입니다. 나는 그것이 무한 루프라고 생각하지만, 나는 왜 그런지 모른다.

+1

while 루프는 'i'가 0이 아닌 경우에만 종료됩니다. while 루프의 첫 번째 반복 중에 어떤 현상이 발생했는지 확인할 수 있습니까? 두 번째 반복은 어떻습니까? 아마도 while 루프보다는 if 문을 사용하는 것이 좋습니다. – beetea

답변

5

i이 처음으로 어떻게 될지 생각해 보면 0이됩니다.

i은 루프 내에서 변경되지 않으므로 while 루프가 시작되고 이 중지되지 않습니다.

다음과 같은 성적 증명서, 당신의 약간의 수정에 따라 뭔가 더 나을 것 : 그렇지 않으면 하나를 추가,

>>> list1 = [0,0,0,0,0,1,2] 
>>> count = 0 
>>> for item in list1: 
...  if item == 0: 
...   count = count + 1 
...  else: 
...   break 
... 
>>> print count 
5 

또는 비 - 제로 값을 즉시 중단 약간 짧은 변화 : 다른 해설자 말했듯이

>>> list1 = [0,0,0,0,0,1,2] 
>>> count = 0 
>>> for item in list1: 
...  if item != 0: break 
...  count = count + 1 
... 
>>> print count 
5 
+0

또한 '0'으로 시작하지 않으면 전혀 실행되지 않습니다. –

+0

@Dennis,'k'가 0으로 끝나기 때문에 그 경우는 괜찮습니다. 이것이 맞습니다. – paxdiablo

+0

여기에있는 'else : break'는 for 루프에서 벗어나기 때문에 실수입니다. 따라서 0이 아닌 숫자 뒤에 0이 있으면 계산되지 않습니다. 'else : break'를 제거하면이 예제가 작동합니다. –

2

는 코드에서 문제는 당신이 while 키워드의 의미를 오해하는 것이다. 당신은 파이썬을 알게하기 시작하는 경우 itertools 이벤트 잘 가치가 무엇인지에 장난,

>>> import itertools 
>>> k = len(list(itertools.takewhile(lambda x: x == 0, L1))) 
>>> k 
5 
>>> k = len(list(itertools.takewhile(lambda x: x == 0, L2))) 
>>> k 
0 

: 그건 제쳐두고,이 같은 문제에 대해, 나는 종종 더 기능적인 스타일을 선호한다.

+3

대신'sum (_ for takewhile (...)) '을 사용했습니다. – arshajii

+0

일종의'iterlen '이 있었으면 좋겠지 만,'sum' 트릭은 꽤 잘 작동합니다. (실제로 문제가되는 코드를 작성했다고 생각하면 항상 이상하게 느껴집니다.) – user2357112

0

내 대답은 paxdiablo 's에서 확장됩니다. 내가 잘못 읽은 L2 사례에 대한 OP의 의도를 명확히 해준 덕분에

이 시점에서 나는 기본 언어 기능을 마스터하는 것이 가치 있다고 말하고 싶습니다. 코드에서

, 당신은이 작업을 수행 : 당신이 L1에 코드의 덩어리를 실행하면

L1 = [0, 0, 0, 0, 0, 1, 2] 

k = 0 
for i in L1: 
    while i == 0: 
     k = k + 1 

, 그것은 영원히 반복합니다. 이유는 다음과 같습니다.

for은 들여 쓰기로 따로 설정된 코드 (아래 코드를 의미)가 반복되도록합니다. 따라서 루프의 for i in L1: 루프는 L1의 각 항목에 대해 한 번 들여 쓰기를 실행합니다.

그러나 while은 비슷한 기능을 수행합니다. whilewhile 구문의 조건이 False이 될 때까지 파이썬이 그 아래에 들여 쓰기 된 코드를 반복해서 실행하도록합니다.

따라서 L1의 경우 처음으로 for 루프를 통해 i이 0으로 설정됩니다.그런 다음 while i == 0:은 이 더 이상 0이 아닐 때까지 k = k + 1으로 묶인 코드를 반복해서 실행한다고 말합니다. 불행하게도 while 루프의 코드는 i의 값을 변경하지 않으므로 i은 끝날 때까지 0이되므로 영원히 실행되어 k에 하나를 반복하여 추가합니다.

찾고있는 것은 루프가되지 않는 if 문입니다. 테스트가 사실인지 여부에 따라 동봉 된 코드를 실행할지 여부를 결정합니다. 그래서, 대신 :

while i == 0: 
     k = k + 1 

당신이 for 루프를 통해, 그리고 각각의 시간을

if i == 0: 
     k = k + 1 
    else: 
     break 

를 사용할 수있는 코드는 i이 0 만약 그렇다면, 한 번만, 그것은 추가 여부를 묻습니다 1에서 k으로 이동 한 후 다음 목록 요소로 이동합니다. 귀하의 L2 사건을 커버하기 위해 숫자가 0이 아닌 숫자를 치면 breakfor 루프를 종료하고 계산을 중단합니다.

itertools으로 표시된 대답은 영리하고 유용하며 알아두면 좋을 것입니다. 매우 큰 목록에는 무엇을 사용하고 싶은지 모르겠지만 언어를 배우는 것 같아서 (아마도 모국어를 배우고있는 것 같습니다.), for, whileif을 올바르게 사용하는 방법을 배우는 것이 좋습니다.

0

당신이 생각하고있는 것은 조건이 충족되지 않을 때까지 정상적으로 수행됩니다. 이 코드가 실제로하는 일은 조건이 충족되지 않을 때까지 while 루프를 반복하는 것입니다.

숫자가 0이 아닐 때까지 계산을 계속 수행하여 가능한 멀리 수행하려고하는 나의 해결책이 있습니다. 그러면 숫자가 0이 아니고 for 루프가 얼마나 멀리 떨어져 있는지 살펴 봅니다.

k = 0 
for index,item in enumerate(L1): 
    if item != 0: 
     k = len(L1[:index]) 
     break