以下是该方案:
我有一长串带有时间戳的文件名列表,其中包含时间戳之前和之后的字符。
这样的事情:prefix_20160817_suffix
我想要的是一个列表(最终将是原始列表的一个子集),其中包含具有特定前缀,后缀和时间戳部分的文件名。这些特定字符串已在列表中给出。注意:这个"包含"列表的大小可能会有所不同。
例如:['prefix1', '2016', 'suffix']
或['201608', 'suffix']
如何轻松获取包含"包含"中的每个元素的文件名列表。阵列
这里有一些伪代码来展示我想要的东西:
for each fileName in the master list:
if the fileName contains EVERY element in the "contains" array:
add fileName to filtered list of filenames
答案 0 :(得分:4)
我将列表编译成fnmatch
pattern:
import fnmatch
pattern = '*'.join(contains)
filetered_filenames = fnmatch.filter(master_list, pattern)
这基本上将contains
中的所有字符串连接成一个包含*
通配符的glob模式。这假定contains
的顺序很重要。鉴于你正在寻找中间的前缀,后缀和(部分)日期,这不是那么多。
请务必注意,如果在具有不区分大小写的文件系统的操作系统上运行此操作,则fnmatch
匹配也不区分大小写。这通常正是你在这种情况下想要的。
答案 1 :(得分:1)
您正在寻找类似的内容(使用列表理解和all()
:
>>> files = ["prefix_20160817_suffix", "some_other_file_with_suffix"]
>>> contains = ['prefix', '2016', 'suffix']
>>> [ f for f in files if all(c in f for c in contains) ]
['prefix_20160817_suffix']
答案 2 :(得分:1)
假设:
>>> cond1=['prefix1', '2016', 'suffix']
>>> cond2=['201608', 'suffix']
>>> fn="prefix_20160817_suffix"
您可以使用in
和(在临时示例中)列表理解来测试条件列表中每个子字符串的存在性:
>>> [e in fn for e in cond1]
[False, True, True]
>>> [e in fn for e in cond2]
[True, True]
然后可以在单个all
语句中使用它来测试所有子字符串:
>>> all(e in fn for e in cond1)
False
>>> all(e in fn for e in cond2)
True
然后你可以与filter
结合使用(或使用列表推导或循环)来过滤列表:
>>> fns=["prefix_20160817_suffix", "prefix1_20160817_suffix"]
>>> filter(lambda fn: all(e in fn for e in cond1), fns)
['prefix1_20160817_suffix']
>>> filter(lambda fn: all(e in fn for e in cond2), fns)
['prefix_20160817_suffix', 'prefix1_20160817_suffix']
答案 3 :(得分:1)
您的伪代码与可用的实现距离不远,如您所见:
masterList=["prefix_20160817_suffix"]
containsArray=['prefix1', '2016', 'suffix']
filteredListOfFilenames=[]
for fileName in masterList:
if all((element in fileName) for element in containsArray):
filteredListOfFilenames.append(fileName)
我建议深入了解真正的official tutorial - 它包含许多有用的东西。
答案 4 :(得分:0)
这应该适合你。
filtered_list = []
for file_name in master_list:
for element in contains_array:
if element not in file_name:
break
filtered_list.append(file_name)