Python(和大多数语言)很可能会混淆,如果您在对列表使用迭代器的同时修改列表。在
这段代码就是这个问题的牺牲品,因为你修改的是你正在迭代的同一个列表。更常见的是构造一个新的列表作为输出。下面是一个例子:def yield_only_floats(l):
for s in l:
try:
float(s)
yield s
except ValueError:
pass
x = list(yield_only_floats(["1.115","","","4.3"]))
print x
得到['1.115','4.3']
如果要修改原始列表,仍可以执行以下操作:
^{pr2}$
但是,如果你真的想在迭代的同时修改你正在迭代的同一个列表,最好的方法是反向迭代:def leave_only_floats(l):
for i in xrange(len(l) - 1, -1, -1):
try:
float(l[i])
except ValueError:
del l[i]
x = ["1.115","","","4.3"]
leave_only_floats(x)
请注意,我还使用了位置删除,而不是值删除,这使得删除速度更快(不必再次搜索列表)
顺便说一句,你也可以考虑使用列表理解:def is_float(s):
try:
float(s)
return True
except ValueError:
return False
x = ["1.115","","","4.3"]
y = [s for s in x if is_float(s)]
就我个人而言,我认为对于这类问题,列表理解法是最具可读性的。在