从列表中删除等于来自由字符串和数字组成的列表中的数字的项目

时间:2017-06-13 15:35:07

标签: python

我有一个以下结构的列表,为了这个问题的目的简化了这个结构:

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"]

我如何实现这一目标?

编辑:帕特里克在下面的评论中的回答正是我所看到的并解决了这个问题。

5 个答案:

答案 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:

  • 任何数字类型的零,例如,0,0.0,0j。
  • 任何空序列,例如'',(),[]。
  • 任何空映射,例如{}。
  • 用户定义类的实例,如果类定义 bool ()或 len ()方法,则该方法返回整数零或bool值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]

一些小建议:

  1. 您不必指定else: pass
  2. 您可以直接在列表上进行迭代,即代替:

    for i in range(len(x)):
        x[i]
    

    你可以简单地使用:

    for i in x:
        i
    
  3. 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