program tip

Python : 목록을 반복하는 동안 목록 요소 제거

radiobox 2020. 10. 20. 07:31
반응형

Python : 목록을 반복하는 동안 목록 요소 제거


이 질문에 이미 답변이 있습니다.

나는 파이썬의 요소 목록을 반복하고 그것에 대해 몇 가지 작업을 수행 한 다음 특정 기준을 충족하면 제거합니다.

for element in somelist:
    do_action(element)
    if check(element):
        remove_element_from_list

remove_element 대신 무엇을 사용해야합니까? 비슷한 질문이 있지만 모든 요소에 대해 실행되는 do_action 부분이 있음을 확인하여 필터 사용 솔루션을 제거합니다.


언제든지 목록 사본을 반복하여 원본을 자유롭게 수정할 수 있습니다.

for item in list(somelist):
  ...
  somelist.remove(item)

이러한 기준을 충족하려면 원본 목록을 원래 목록에서 수정하고 목록 사본이없고 한 번만 통과하면 작동 합니다. 기존 솔루션은 역방향 으로 반복하는 것입니다 .

for i in xrange(len(somelist) - 1, -1, -1):
    element = somelist[i]
    do_action(element)
    if check(element):
        del somelist[i]

보너스 : len(somelist)매번 반복 하지 않습니다 . 모든 버전의 Python에서 작동합니다 (적어도 1.5.2까지 거슬러 올라감) ... s / xrange / range / for 3.X.

업데이트 : 앞으로 반복하고 싶다면 더 까다 롭고 추악 할 수 있습니다.

i = 0
n = len(somelist)
while i < n:
    element = somelist[i]
    do_action(element)
    if check(element):
        del somelist[i]
        n = n - 1
    else:
        i = i + 1

목록 구성 :

results = [x for x in (do_action(element) for element in somelist) if check(element)]

for element in somelist:
    do_action(element)
somelist[:] = (x for x in somelist if not check(x))

목록을 복사하지 않고 한 번에 수행해야하는 경우

i=0
while i < len(somelist):
    element = somelist[i] 
    do_action(element)
    if check(element):
        del somelist[i]
    else:
        i+=1

여전히 필터를 사용하여 요소 수정을 외부 기능으로 이동할 수 있습니다 (한 번만 반복).

def do_the_magic(x):
    do_action(x)
    return check(x)

# you can get a different filtered list
filter(do_the_magic,yourList)

# or have it modified in place (as suggested by Steven Rumbalski, see comment)
yourList[:] = itertools.ifilter(do_the_magic, yourList)

제거되지 않은 모든 것을 반환하는 생성기를 만들 수 있습니다.

def newlist(somelist):
    for element in somelist:
        do_action(element)
        if not check(element):
            yield element

그렇게하는 또 다른 방법은 다음과 같습니다.

while i<len(your_list):
    if #condition :
        del your_list[i]
    else:
        i+=1

따라서 확인하면서 요소를 나란히 삭제합니다.


왜 그것을 다시 작성하지 않습니까?

for element in somelist: 
   do_action(element)  

if check(element): 
    remove_element_from_list

반복하는 동안 목록에서 항목 제거를 이미 본 것처럼 보이지만 목록에서 제거하는 방법은이 질문을 참조하십시오.

또 다른 옵션은 이것을 동일하게 유지하고 싶다면 이렇게하는 것입니다.

newlist = [] 
for element in somelist: 
   do_action(element)  

   if not check(element): 
      newlst.append(element)

Not exactly in-place, but some idea to do it:

a = ['a', 'b']

def inplace(a):
    c = []
    while len(a) > 0:
        e = a.pop(0)
        if e == 'b':
            c.append(e)
    a.extend(c)

You can extend the function to call you filter in the condition.

참고URL : https://stackoverflow.com/questions/6022764/python-removing-list-element-while-iterating-over-list

반응형