【问题标题】:How to remove a string from a list that startswith prefix in python如何从python中以前缀开头的列表中删除字符串
【发布时间】:2014-04-30 22:34:02
【问题描述】:

我有这个字符串列表和一些前缀。我想从列表中删除以任何这些前缀开头的所有字符串。我试过了:

prefixes = ('hello', 'bye')
list = ['hi', 'helloyou', 'holla', 'byeyou', 'hellooooo']
for word in list:
    list.remove(word.startswith(prexixes)

所以我希望我的新列表是:

list = ['hi', 'holla']

但我收到此错误:

ValueError: list.remove(x): x not in list

怎么了?

【问题讨论】:

    标签: python string list startswith


    【解决方案1】:

    您可以创建一个新列表,其中包含所有以您的前缀之一开头的单词:

    newlist = [x for x in list if not x.startswith(prefixes)]
    

    您的代码不起作用的原因是 startswith 方法返回一个布尔值,而您要求从列表中删除该布尔值(但您的列表包含字符串,而不是布尔值)。

    请注意,将变量命名为 list 通常不是一个好主意,因为这已经是预定义的 list 类型的名称。

    【讨论】:

    • 嘿,我了解到startswith 可以将元组作为参数。酷!
    • 我实际上并没有使用list作为变量名,这里只是作为一个例子。顺便说一句,这对我有用:)
    • 是的,从 python 2.5 开始,startswith 可以将元组作为参数:)
    • 谢谢,我不应该使用更多:) ......不是(哈哈,对不起我的幽默感)
    【解决方案2】:

    Greg 的解决方案肯定更 Pythonic,但在您的原始代码中,您的意思可能是这样的。请注意,我们制作了一个副本(使用list[:] 语法)并遍历该副本,因为您不应该在遍历列表时修改它。

    prefixes = ('hello', 'bye')
    list = ['hi', 'helloyou', 'holla', 'byeyou', 'hellooooo']
    for word in list[:]:
        if word.startswith(prefixes):
            list.remove(word)
    print list
    

    【讨论】:

    • 尽管 Gregs 的答案可能更 Pythonic,但我还是接受了这个答案,因为这正是我想要的。谢谢!
    • 嘿,谢谢你的回答。很抱歉挖出这篇旧帖子,但您能解释一下为什么在使用 for word in list: 而不是 for word in list[:]: 时会产生错误的结果
    【解决方案3】:
    print len([i for i in os.listdir('/path/to/files') if not i.startswith(('.','~','#'))])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2011-05-08
      • 2011-07-25
      • 1970-01-01
      • 2019-05-30
      • 2019-08-11
      • 2015-09-10
      相关资源
      最近更新 更多