2017-02-18 1 views
1

배열에서 브로 삭제 파이썬 프로그램 작성 nums에서 발을 삭제 파이썬 : 제 프로그램은 : 두 개의 프로그램은

class Solution(object): 
    def removeElement(self,nums,val): 

     for x in nums: 
      if x == val: 
       nums.remove(val) 
     return len(nums) 

상기 발 3 인 nums는 [3,3]이다

, 출력 : 1 개

번째 프로그램이다

class Solution(object): 
    def removeElement(self,nums,val): 

     while val in nums: 
      nums.remove(val) 
     return len(nums) 

nums가 발 3이며, [3,3]이고, 출력은 0

,

차이점과 이유를 알려주시겠습니까

+0

배열에서 요소를 제거하면서 루핑하면 일반적으로 이상한 동작과 문제가 발생합니다. –

답변

1

반복하는 동안 변경되는 내용을 Python이 반복하는 데 어려움이 있습니다. 실패하거나 예기치 않은 결과를 반환하거나 결코 반복을 종료 할 수 있습니다.

용기도 그러한 모든 반복자 이상, 그것을 루프 훨씬 덜 후크도 변경 - 방법 밖으로 을하고 어떻게 든 마술 각 반복자가 변경에 대해 알려 반복자를 추적하지 않기 때문에

. 아주 미묘하고 복잡한 코드 일 것이며 은 매우 빈번한 작업 속도를 줄입니다.

print([i for i in nums if i!=val]) 
다음 iteration.So에게 올바른 방법을 종료하지 않습니다

nums=[3,4] 
val=3 

for x in nums: 
    print(x,nums) 
    if x > val: 
     nums.append(4) 

위의 코드는 제거하지 않는 요소 만 포함 된 새 목록을 만들 수 지능형리스트를 사용하는 것입니다

또는 현재 위치에서 변경 :이 도움이

nums[:] = [i for i in nums if i!=val] 

희망.

0

첫 번째 예에서는 목록의 요소를 반복하면서 목록 내의 요소를 삭제합니다. 첫 번째 remove 이후에 반복이 없어지므로 문제가됩니다. 목록 인 경우

예를 들어, l = [1, 1, 2, 2] 및 첫 번째 2removeElement(l, 2) 전화가 삭제되고, l의 길이는 3되며이 남아있는 반복되지 않습니다 (목록 [1, 1, 2] 될 것입니다 당신이 될 것입니다 반복 횟수 3에서 루프가 멈추고 리턴 된 값은 [1, 1, 2]입니다.

두 번째 경우 while 문은 다음과 같습니다. 여전히 목록에 2 개가 있지만 목록에서 2 개를 계속 제거하십시오. 이렇게하면 첫 번째 반복 후 l[1, 1, 2]처럼 보이며 그 안에 2가 계속 남아 있으므로 루프가 계속되고 [1, 1]이됩니다.

l = [3, 3]으로 사례를 적용하고 이해했는지 확인하십시오.

호프가 도움이 되었습니까?