我有一个以下结构的列表,为了这个问题的目的而简化了:
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"]
我该如何实现这一目标?
编辑:帕特里克在下面的评论中的回答正是我所寻找的并解决了这个问题。
最佳答案
我还要注意,在 x 是一个大列表的情况下,您可能希望在列表过滤后返回迭代器,因为在大型数据集上使用迭代器可能会提高性能(参见 Performance Advantages to Iterators?了解更多信息)。 在这种情况下,您可以使用内置的 filter(function, iterable) 函数,它将在 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 的元素才会被打印出来。 请参阅 https://docs.python.org/3/library/functions.html#filter 以获取有关内置过滤器的更多信息。
另一种方法是使用生成器理解。这里要注意的是,您只能迭代生成器一次。但是您也会有一些好处,每个结果都将在运行中进行评估和产生,因此您可以通过使用生成器表达式来节省内存。
只需使用此示例即可使用生成器理解:
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://www.python.org/dev/peps/pep-0289/
也可以通过真值测试来准确过滤结果。
Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below. The following values are considered false:
- 没有
- 错误
- 任何数字类型的零,例如 0、0.0、0j。
- 任何空序列,例如,''、()、[]。
- 任何空映射,例如 {}。
- 用户定义类的实例,如果该类定义了 bool() 或 len() 方法,当该方法返回整数零或 bool 值 False 时。
所以表达式 [sym for sym in x if sym]
将从结果中删除所有 False 符号(即 False、'' 等)。因此,使用真值测试要准确(有关详细信息,请参阅 https://docs.python.org/3.6/library/stdtypes.html#truth-value-testing)。
关于python - 从列表中删除等于数字的项目 从由字符串和数字组成的列表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44525890/