【问题标题】:Remove string from list if from substring list如果从子字符串列表中删除字符串
【发布时间】:2015-04-23 18:53:20
【问题描述】:

我想知道最pythonic的方法是什么:

拥有一个字符串列表和一个子字符串列表会删除字符串列表中包含任何子字符串列表的元素。

list_dirs = ('C:\\foo\\bar\\hello.txt', 'C:\\bar\\foo\\.world.txt', 'C:\\foo\\bar\\yellow.txt')

unwanted_files = ('hello.txt', 'yellow.txt)

期望的输出:

list_dirs = (C:\\bar\\foo\.world.txt')

我曾尝试实施类似的问题,例如this,但我仍在努力进行删除并将该特定实施扩展到列表中。

到目前为止,我已经这样做了:

for i in arange(0, len(list_dirs)):
    if 'hello.txt' in list_dirs[i]:
        list_dirs.remove(list_dirs[i])

这可行,但可能不是更简洁的方式,更重要的是它不支持列表,如果我想删除 hello.txt 或 yellow.txt,我将不得不使用 or。谢谢。

【问题讨论】:

  • @PM 2Ring 是的,我使用的是 numpy。 arange 类似于 range
  • 修改您正在迭代的集合是不安全的。

标签: python string list numpy substring


【解决方案1】:

使用list comprehensions

>>> [l for l in list_dirs if l.split('\\')[-1] not in unwanted_files]
['C:\\bar\\foo\\.world.txt']

使用split 获取文件名

>>> [l.split('\\')[-1] for l in list_dirs]
['hello.txt', '.world.txt', 'yellow.txt']

【讨论】:

  • 现在看起来更近了。这个实现需要不需要的文件的正确文件名还是只需要一个子字符串?我测试过,似乎需要所有正确的文件名
  • 我们是否可以将其修改为正确文件名的子字符串?
  • l.split('\\')[-1] 在我的回答中是正确文件名的子字符串。查看我的编辑
  • @dudas:如果您需要完整的子字符串检测功能,您应该在问题中这么说!要做到这一点,需要与 Michael9 的解决方案不同的策略:它需要一个双循环。
  • @dudas:在这种情况下,也许您应该提出一个新问题,并提供适当的示例输入。
【解决方案2】:

你也可以使用带有 lambda 的过滤函数

print filter(lambda x: x.split('\\')[-1] not in unwanted_files, list_dirs)
#['C:\\bar\\foo\\.world.txt']

或者如果您不介意导入 os(imo 这更干净,然后拆分字符串)

print filter(lambda x: os.path.basename(x) not in unwanted_files, list_dirs)

在列表理解中,它看起来像这样

[l for l in list_dirs if os.path.basename(l) not in unwanted_files]

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2020-11-11
    • 2021-12-28
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多