Python 将列表与具有多个值的字典进行比较并且 return 匹配

Python compare list to dictionary with multiple values and return matches

如果我这个列表:

list1 = ['a long way home she said', 'amazing grace for me', 'shes super cool']

我想将列表 1 中的每一项与下面 dict1 中的值进行比较:

dict1 = {
'Formula1': ('a long way home', 'nothing to see here'),
'Formula 2': ('nasty girl', 'nope'),
'Formula 3': ('disguisting', 'nope'),
'Formula 4': ('amazing grace', 'hello world')
}

如何使用 list1 中的整个匹配短语将输出 return 来自 dict1 的键?

所需的输出将是:

['Formula1': ('a long way home she said'), 'Formula 4': ('amazing grace for me')] or

{'Formula1': ('a long way home she said'), 'Formula 4': ('amazing grace for me')}

我试着这样做:

import itertools

[x if not x in itertools.chain(dict1.values()) else [key for key in dict1 if value in dict[key]][0] for x in list1]

但我认为我的输出实际上只是 return 在遍历字典值后列表中的所有内容。我有数百万条记录要处理,因此列表理解优于循环。

[name for name, title in dict1.items() if all(x in title for x in list1)]

这只是 return 一个空列表

为字典中的每个键创建一个新元组。对于 list1 中的每个元素,如果原始元组值中存在一个字符串是该元素的子字符串,则将其保留在结果中。存储此计算的结果(在下面的代码片段中,我们将其存储在 phrases 变量中)。

然后,我们使用字典理解过滤掉所有具有空值元组的 key-value 对。你可以把它压缩成一行,但我认为它在这一点上变得非常不可读:

phrases = {
    key: tuple(
            filter(lambda x: any(substr in x for substr in value), list1)
        )
        for key, value in dict1.items()
}
result = {key: value for key, value in phrases.items() if value != ()}

print(result)

这输出:

{
    'Formula1': ('a long way home she said',),
    'Formula 4': ('amazing grace for me',)
}