如果您要达到的目标是您在对@Wasif Hasan 的回答的评论中描述的,这与您在问题描述中的描述不同,您可以尝试:
>>> from collections import defaultdict
>>> import re
>>>
>>> personality = {
... "sincerity": ["tru", "honest"],
... "excitement": ["excit", "fizzy"]}
>>> prova = {
... "brand1": ["true", "truth", "thrutfull", "orange", "friend", "meaning"],
... "brand2": ["truth", "exiting", "excited", "lama", "lambo", "blade"]}
>>>
>>> patterns = {k:re.compile(f"\s?({'|'.join(v)})") for k,v in personality.items()}
>>> results = defaultdict(dict)
>>>
>>> for k1, v1 in prova.items():
... for k2, v2 in patterns.items():
... results[k1][k2] = len(v2.findall(' '.join(v1)))
...
>>> results
defaultdict(<class 'dict'>, {'brand1': {'sincerity': 2, 'excitement': 0}, 'brand2': {'sincerity': 1, 'excitement': 1}})
>>> results['brand1']
{'sincerity': 2, 'excitement': 0}
上面的代码首先创建了一个由正则表达式对象组成的dict(参见patterns = ...)。 dict 与personality 具有相同的键,并且值是与personality 中的值生成的模式相对应的对象。例如,sincerity 的模式是 "\s?(tru|honest)"。构造该模式以便我以后可以在没有空格或一个空格之后搜索tru 或honest。我使用这些模式在 prova 中的每个品牌的值中搜索匹配项。为了计算出现次数,我从值构造一个字符串(例如,brand1 ["true", "truth", "thrutfull", "orange", "friend", "meaning"] 变为 "true truth thrutfull orange friend meaning")并使用 len(findall) 查找匹配数。
注意事项:
- 我假设与
prova 中的每个品牌关联的lists 没有重复项(或者如果它们有重复项,您有兴趣计算多次出现多次的单词)。如果不是这种情况,您需要使用set() 更新' '.join(v1) 以消除重复项。
- 我还假设
personality 中的字符串是您希望prova 中的单词开始的方式。相反,如果您正在到处寻找匹配项,则需要更新 re.compile...,例如删除 \s?。
- 您的描述中有一个错字,即“thrutfull”。这就是为什么即使您希望个性[sincerity] 中的 "tru" 与 prova[brand1] 中的 "true"、"truth"、"truthful" 匹配,但您在上面看到的情况是有 2 个匹配(而不是 3 个)。