通过删除列表元素来更改for循环范围

时间:2016-07-08 13:32:49

标签: python string for-loop string-length del

我是python和编程的新手,目前正在学习基础知识。在下面的脚本中,我试图检查每个列表元素中的字母数,并删除具有五个或更多字母的字母。我正在使用for循环来实现这一点,但是由于列表元素数量的变化而导致出现问题,这与最初考虑的for循环范围不对应。我试图让范围变化,但我仍然得到错误。

# -*- coding: utf-8 -*-

magicians =['alice','david','carolina']

def counter(word):
    x= sum (c != ' ' for c in word)
    return x

print magicians
for i in range (0,3):
        magicians[i]=magicians[i].title()
print magicians
q=
Y=range (0,q)

for i in Y:
    x= counter(magicians[i])
    print x    
    if x<=5:
        print 'this component will be deleted:', magicians[i]
        del magicians[i]
        q=q-1
        Y=range (0,q)
print magicians

谢谢

2 个答案:

答案 0 :(得分:0)

您的代码的主要问题是,循环中的Y = ... 会对Y中的for i in Y产生影响。

for i in Y:
    ...
        Y=range (0,q)

可以更改您的代码以使用while循环,并手动管理当前索引和最大索引,但这很容易出错:

i = 0
while i < q:
    x= counter(magicians[i])
    if x<=5:
        print 'this component will be deleted:', magicians[i]
        del magicians[i]
        q=q-1
    else:
        i += 1

不是在迭代同一列表时从列表中删除元素,而是填充第二个列表,只保留要保留的元素,例如,更好的做法。使用列表理解:

good_magicians = [m for m in magicians if counter(m) > 5]

答案 1 :(得分:-1)

在这篇文章中,您的问题有一个复杂的答案:Remove items from a list while iterating

最简单的方法是创建一个仅包含您实际需要的元素的新列表。