Python:迭代列表时删除列表元素[重复]
- 2024-12-19 09:24:00
- admin 原创
- 120
问题描述:
我正在遍历 Python 中的元素列表,对其执行一些操作,然后如果它们满足某些条件则删除它们。
for element in somelist:
do_action(element)
if check(element):
remove_element_from_list
我应该用什么来代替 remove_element?我见过类似的问题,但请注意 do_action 部分的存在,该部分将针对所有元素执行,从而消除了使用过滤器的解决方案。
解决方案 1:
您可以随时迭代列表的副本,从而可以自由修改原始列表:
for item in list(somelist):
...
somelist.remove(item)
解决方案 2:
为了满足这些标准:就地修改原始列表,不复制列表,仅传递一次,有效,传统解决方案是向后迭代:
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/ 适用于 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
解决方案 3:
列表组成:
results = [x for x in (do_action(element) for element in somelist) if check(element)]
解决方案 4:
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
解决方案 5:
您仍然可以使用过滤器,将元素修改移至外部函数(仅迭代一次)
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)
解决方案 6:
另一种方法是:
while i<len(your_list):
if #condition :
del your_list[i]
else:
i+=1
因此,您可以在检查时并排删除元素
解决方案 7:
您可以创建一个生成器,返回所有未被删除的内容:
def newlist(somelist):
for element in somelist:
do_action(element)
if not check(element):
yield element
解决方案 8:
为什么不将其重写为
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)
解决方案 9:
虽然不完全到位,但有一些想法可以做到:
a = ['a', 'b']
def inplace(a):
c = []
while len(a) > 0:
e = a.pop(0)
if e == 'b':
c.append(e)
a.extend(c)
您可以扩展该函数来在条件中调用过滤器。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD