programing

Python: 목록 위에서 반복하는 동안 목록 요소 제거

starjava 2023. 8. 15. 09:41
반응형

Python: 목록 위에서 반복하는 동안 목록 요소 제거

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)

또 다른 방법은 다음과 같습니다.

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

확인하는 동안 요소를 나란히 삭제합니다.

제거되지 않은 모든 항목을 반환하는 제너레이터를 만들 수 있습니다.

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

다시 쓰는 게 어때요?

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)

정확하게 제자리에 있지는 않지만, 그것을 할 수 있는 몇 가지 아이디어:

a = ['a', 'b']

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

호출할 수 있는 기능을 확장하여 조건에서 필터링할 수 있습니다.

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

반응형