繁体   English   中英

如何在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”应该匹配prova[brand1]中的“true”、“truth”、“truthful”和 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) set()以消除重复项。
  2. 我还假设personality中的字符串是您期望prova单词的开头方式。 相反,如果您到处寻找匹配项,则需要更新re.compile... ,例如删除\\s? .
  3. 在您的描述中,您有一个错字,即“thrutfull”。 这就是为什么即使您期望个性 [真诚] 中的“真实”与 prova[brand1] 中的“真实”、“真实”、“真实”相匹配,但您在上面看到的情况是有 2 个匹配项(而不是 3 个)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM