【问题标题】:How to match all words starting with a certain sequence of letters in a for loop? (Python)如何在for循环中匹配以特定字母序列开头的所有单词? (Python)
【发布时间】:2021-02-19 23:24:45
【问题描述】:

我有一本包含一些性格特征和相关形容词的字典:

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中的“true”、“truth”、“truthful” [brand1] 和 prova[brand2] 中的“真相”。

由于我有很多品牌,我想通过 for 循环来做到这一点。有什么建议吗?

【问题讨论】:

  • 小提示:定义字符串时最好不要混用单引号和双引号。 Python's style guide邀请我们选择并坚持下去。

标签: python text string-matching word-count


【解决方案1】:

如果您要达到的目标是您在对@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 = ...)。 dictpersonality 具有相同的键,并且值是与personality 中的值生成的模式相对应的对象。例如,sincerity 的模式是 "\s?(tru|honest)"。构造该模式以便我以后可以在没有空格或一个空格之后搜索truhonest。我使用这些模式在 prova 中的每个品牌的值中搜索匹配项。为了计算出现次数,我从值构造一个字符串(例如,brand1 ["true", "truth", "thrutfull", "orange", "friend", "meaning"] 变为 "true truth thrutfull orange friend meaning")并使用 len(findall) 查找匹配数。

注意事项:

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

【讨论】:

    【解决方案2】:

    你可以像这样使用 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)
    

    【讨论】:

    • 谢谢你的回答,但我想在最后得到的是这样的:品牌 1 = {诚意:1234,兴奋:5678,...} 对于所有品牌,其中数字是个性[真诚]和个性[兴奋]中的单词出现在prova[brand1]中的次数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多