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
'program tip' 카테고리의 다른 글
Python 표시 문자열을 여러 번 (0) | 2020.10.21 |
---|---|
xxhdpi Android의 스케일 팩터? (0) | 2020.10.20 |
개발자가 먼저 가독성이나 성능을 목표로해야합니까? (0) | 2020.10.20 |
MySQL 명령 줄 클라이언트에서 자동 완성 (0) | 2020.10.20 |
Javascript Array Concat이 작동하지 않습니다. (0) | 2020.10.20 |