2016-06-16 3 views
-3
def purify(ls): 
    y = ls 
    for i in ls: 
     if i % 2 != 0: 
      y = y.remove(i) 

    print y 

다음 코드는 목록 (4, 5, 5, 4)을 전달할 때 실패합니다. (4, 4) 대신 (4, 5, 4)를 반환합니다. 여기서 뭐가 잘못 됐니? y 목록의 변경이 원래 목록 ls에 영향을 미치는 이유를 이해할 수 없습니다.목록에서 홀수 제거

답변

1

이렇게하면됩니다.

In [1]: a = (4, 5, 5, 4) 
In [2]: result = [i for i in a if not i % 2] 
In [3]: result 
Out[1]: [4, 4] 

기능 있음.

def purify(ls): 
    return [i for i in ls if not i % 2] 

자세한 내용을 보려면 내 코드를 확장하십시오.이 기능을 통해 작동 방식을 이해할 수 있습니다.

def purify(input_list): 
    result = [] 
    for i in input_list: 
     if not i % 2: 
      result.append(i) 
    return result 
1

항목 제거가 시작되면 색인이 변경됩니다. 루프에서 항목을 변경하는 동안 목록을 반복하는 것은 좋지 않습니다.

def purify(ls): 
    for i in ls[:]: 
     if i % 2 != 0: 
      ls.remove(i) 

을하거나 지능형리스트를 사용 : 대신 목록 ls[:]조각에 반복

[i for i in ls if i % 2 == 0] 
+0

하지만 목록 y를 편집하고이 아니라 원래 목록 LS. y 목록의 함수 제거가 원래 목록 ls에 영향을주는 이유를 이해할 수 없습니다. –

+0

두 변수가 동일한 객체를 가리키고 있습니다. 그래서'x = y = [ 'a']'그리고'x [0] = 4'를하면'y'도 업데이트됩니다. –

0

다음 코드는 이해하기가 훨씬 깨끗하고 쉽게을 :

l = [4, 5, 5, 4] 

l = filter(lambda x: x % 2 == 0, l) 

print(l) 

[4, 4]

0
remove(...) 
    L.remove(value) -- remove first occurrence of value. 
    Raises ValueError if the value is not present. 

올바른 버전 :

>>> filter(lambda x: x % 2 == 0, [4, 5, 5, 4]) 
[4, 4] 

올바른 버전 :

def purify(ls): 
    y = ls[:] # copy it instead of refering to it 
    for i in ls: 
     if i % 2 != 0: 
      y.remove(i) # remove will return none 

    print y