如果来自子字符串列表,则从列表中删除字符串
Remove string from list if from substring list
我想知道什么是最 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。谢谢
>>> [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']
您还可以使用带有 lambda 的过滤器函数
print filter(lambda x: x.split('\')[-1] not in unwanted_files, list_dirs)
#['C:\bar\foo\.world.txt']
或者如果您不介意导入 os
(我认为这比拆分字符串更干净)
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]
我想知道什么是最 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。谢谢
>>> [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']
您还可以使用带有 lambda 的过滤器函数
print filter(lambda x: x.split('\')[-1] not in unwanted_files, list_dirs)
#['C:\bar\foo\.world.txt']
或者如果您不介意导入 os
(我认为这比拆分字符串更干净)
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]