如何在for循环中匹配以特定字母序列开头的所有单词? (Python)

How to match all words starting with a certain sequence of letters in a for loop? (Python)

我有一本字典,里面有一些性格特征和相关形容词:

personality={'sincerity': [ "tru", "honest"],'excitement': ['excit', 'fizzy']} 

(注意这要长得多)

我还有一本字典,其中包含从推文中提取的单词列表:

prova={"brand1": ["true", "truth", "thrutfull", "orange", "friend", "meaning"], "brand2": ["truth", "exiting", "excited", "lama", "lambo", "blade"]} 

我想将 personality 字典中的一个字符串与 prova 字典中包含该字符的所有字符串进行匹配:personality[sincerity] 中的字符串“tru”应该匹配“true”、“truth”、“truthful”在 prova[brand1] 中,“真相”在 prova[brand2] 中。

因为我有很多品牌,我想通过一个for循环来完成。有什么建议吗?

您可以像这样使用 for 循环:

personality={'sincerity': [ "tru", "honest"],'excitement': ['excit', 'fizzy']} 

prova={"brand1": ["true", "truth", "truthfull", "orange", "friend", "meaning"], "brand2": ["truth", "exiting", "excited", "lama", "lambo", "blade"]} 

d = []
for x in personality.values():
  for y in prova.values():
    for z in y:
      for n in x:
        if n in z: 
          d.append(z)
print(d)

但是为列表理解欢呼三声!!

d = [z for x in personality.values() for y in prova.values() for z in y for n in x if n in z]
print(d)

如果您想要实现的是您在对@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)"。构造该模式以便我稍后可以在没有或一个空格后搜索 truhonest。我使用这些模式来搜索 prova 中每个品牌值的匹配项。为了计算出现次数,我根据值构造一个字符串(例如 brand1 ["true", "truth", "thrutfull", "orange", "friend", "meaning"] 变为 "true truth thrutfull orange friend meaning")并使用 len(findall) 查找匹配项数。

备注:

  1. 我假设 prova 中与每个品牌相关的 list 没有重复项(或者如果它们有重复项,您有兴趣计算多次出现多次的单词) .如果不是这种情况,您将需要使用 set() 更新 ' '.join(v1) 以消除重复项。
  2. 我还假设 personality 中的字符串是您希望 prova 中的单词开始的方式。相反,如果您到处寻找匹配项,则需要更新 re.compile...,例如删除 \s?.
  3. 您的描述中有错字,即“thrutfull”。这就是为什么即使您期望 personality[sincerity] 中的 “tru”与 prova[brand1] 中的“true”、“truth”、“truthful”匹配,您在上面看到的情况是有 2 场比赛(而不是 3 场)。