我有一个以下结构的列表,为了这个问题的目的简化了这个结构:
x = ["f","f","f",0,"f",0,0,0"f","f"]
其中“f”表示文件路径为字符串。我想要做的是从列表中删除所有等于零的元素。我试过像这样迭代:
for h in range(len(x)):
if x[g] == "0":
del x[g]
else:
pass
这没有用,因为从迭代列表中删除不起作用,似乎就像列表理解是我正在寻找的答案,但我似乎无法将格式化下来:
x = [h for h in range(len(x)) if h != 0]
所以我最终的期望输出是:
x = ["f","f","f",f","f",f"]
我如何实现这一目标?
编辑:帕特里克在下面的评论中的回答正是我所看到的并解决了这个问题。
答案 0 :(得分:1)
我还要注意,在 x 是大型列表的情况下,您可能希望在列表过滤后返回迭代器,因为在大型数据集上使用迭代器可能会提高性能(请参阅{ {3}}了解更多信息)。 在这种情况下,您可以使用内置的过滤器(函数,可迭代)函数,该函数将在Python 3中返回迭代器。
x = ["f","f","f",0,"f",0,0,0,"f","f"]
for ch in filter(lambda sym: sym != 0, x):
print(ch)
结果只会打印不等于0的元素。 请参阅Performance Advantages to Iterators?以获取有关内置过滤器的更多信息。
另一种方法是使用生成器理解。这里的注意事项是,您只能迭代生成器一次。但是你也会有一些好处,每个结果都会在运行中进行评估和屈服,这样你就可以通过使用生成器表达来保存你的记忆。
只需使用此示例即可使用生成器理解:
x = ["f","f","f",0,"f",0,0,0,"f","f"]
for ch in (sym for sym in x if sym !=0):
print(ch)
在此处查看更多生成器理解示例和优势https://docs.python.org/3/library/functions.html#filter
使用真值测试也可以获得准确的过滤结果。
可以测试任何对象的真值,用于if或while条件或下面布尔运算的操作数。以下值被视为false:
因此,表达式[sym for sym in x if sym]
将从结果中删除所有False符号(即False,''等)。因此,使用真值测试要准确(有关详细信息,请参阅https://www.python.org/dev/peps/pep-0289/)。
答案 1 :(得分:0)
您可以替换所有0和" 0"用:
li = ["f","f","f",0,"f",0,"0",0,"f","f"]
[y for y in l if y not in ("0",0)]
# results:
['f', 'f', 'f', 'f', 'f', 'f']
答案 2 :(得分:0)
试试这个:
x = [h for h in x if h != 0]
一些小建议:
else: pass
。您可以直接在列表上进行迭代,即代替:
for i in range(len(x)):
x[i]
你可以简单地使用:
for i in x:
i
if x[g] == "0"
只检查x[g]
是否等于字符串"0"
,而不是实际数字。根据您的代码判断,您需要if x[g] == 0
代替。
答案 3 :(得分:0)
我希望这段代码能满足您的目的。
x = [i for i in x if i]
这意味着从x得到的所有值都不是0
答案 4 :(得分:0)
您无法执行此循环的原因是因为您在进行中缩短了列表,但如果您向后循环,则您不会遇到此问题:
credit_limit