2016-07-18 2 views
0

목록을 반복하는 동안 목록 요소 (숫자 값)를 제거하려고합니다. 두 가지 예가 있습니다. 예제 1은 작동하지만 예제 2는 작동하지 않지만 두 예제 모두 동일한 로직을 사용합니다.python3에서 반복하는 동안 목록 요소 제거

예 1 : 작업

list1=["5","a","6","c","f","9","r"] 
print(list1) 
for i in list1: 
    if str.isnumeric(i): 
    list1.remove(i) 
print(list1) 

예 2 : [:] : I 사용하여 실시 예 2를 해결

list2=["12abc1","45asd"] 
for items in list2: 
    item_list=list(items) 
    print(item_list) 
    for i in item_list: 
     if str.isnumeric(i): 
      item_list.remove(i) 
    print(item_list) 

작동하지 않음 (item_list에서의 I. 하지만 두 번째 예제가 처음에는 작동하지 않는 이유를 이해할 수 없습니까?

+0

예제 1이 올바르게 작동하는지 확신 할 수 있습니까? isnumeric() 메서드에는 인수가 없기 때문에 말할 수 있습니다. –

+0

작동합니다. str.isnumeric() 인수를 취할 수 – jnth132

답변

0

필자는 파이썬에서 전문가라고 주장 할 수는 없지만, 필자는이 문제에 대해 잘 알고 있지 못하다.

첫 번째 예제는 실제로 두 번째 예제보다 더 잘 작동하지 않지만 테스트하는 데 사용한 데이터가 다르기 때문에 표시되지 않습니다. 문제는 당신이 같은 시간에 어떤 수정을 반복하고 있다는 사실 때문에 것 같다, 그래서 다음은 두 번째 예에서 일어나는 :

  • 의 주어진 목록을 반복합니다 프로그램 :

    [ "1", "2", "a", "b", "c", "1"]

  • 프로그램은 목록 항목 1로 시작합니다. 이것은 숫자이므로 제거됩니다. 이 목록은 현재 다른 :

    [ "2", "A", "B", "C", "1"]

  • 가를 반복되기 때문에, 그것은 2 항을 표시하기 위해 이동한다. 목록 항목 2는 "2"가 아니라 "a"이므로 "2"는 건너 뜁니다.

첫 번째 예제의 숫자가 적어도 하나의 목록 항목으로 구분되어 있기 때문에 모든 숫자가 반복되므로 문제가되지 않습니다.

list2list2[:]으로 변경하는 것에 대한 언급에서 나는 PythonTutor의 visualizor를 통해 프로그램을 실행했을 때 그 프로그램이 작동하지 않는 것처럼 무슨 일이 일어 났는지 전혀 알지 못합니다.

이 문제를 해결하기 위해 가장 확실한 해결책은 배열을 거꾸로 돌아가는 것입니다. 최종 목록 항목부터 시작하여 목록의 시작 부분으로 이동하십시오. 즉, 제거하는 모든 항목이 ' 이전 항목의 번호 매기기에 영향을줍니다.

희망이 있습니다.

+0

내 실수! 그것은 있어야합니다 (for item_list [:] :). 두 번째 루프는 첫 번째 루프가 아닌 변경되어야합니다. – jnth132

+0

목록에있는 연속 번호 (예 : list1 = [ "5", "6", "a", "7", "c", "f", "9" "r"]) – jnth132

+0

아, 맞아. PythonTutor로 다른 테스트를 실행하면 [:]을 (를) 퍼팅하는 것이이 오류를 수정하는 것 같습니다. 검색 후이 대답은 http : // stackoverflow입니다.com/questions/6167238/what-does-in-python-mean은이 사용법이 목록의 복사본을 생성한다고 설명하고 있으므로 for 루프를 사용하여 iterating 할 때 제거하지 않으면 모든 값을 반복합니다. 값은 사용중인 목록 복사본의 값이 아니라 원본 목록의 값입니다. 이것은 예제 1에 [:]을 넣으면 그 예제가 수정된다는 것을 의미합니다. – VortixDev

관련 문제