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
'programing' 카테고리의 다른 글
Chrome 디버거가 닫힌 로컬 변수가 정의되지 않았다고 생각하는 이유는 무엇입니까? (0) | 2023.08.15 |
---|---|
TWIG 템플릿에서 세션 액세스 (0) | 2023.08.15 |
안드로이드.뷰부풀리기예외:이진 XML 파일: 클래스 조각을 채우는 동안 오류가 발생했습니다. (0) | 2023.08.15 |
점 표기 문자열을 사용하여 객체 자식 속성 액세스 (0) | 2023.08.15 |
INSERT ... SELECT를 사용하여 잠금 대기 시간 초과를 방지하는 중 (0) | 2023.08.15 |