如何查看字符串是否包含列表中的所有子字符串? [蟒蛇]

时间:2016-08-17 16:58:33

标签: python python-3.x

以下是该方案:

我有一长串带有时间戳的文件名列表,其中包含时间戳之前和之后的字符。

这样的事情: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

5 个答案:

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