[英]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)"
。 该模式的构造是为了我以后可以在没有空格或只有一个空格之后搜索tru
或honest
。 我使用这些模式在prova
搜索每个品牌的值中的匹配项。 为了计算出现次数,我从值中构造了一个字符串(例如,对于brand1
["true", "truth", "thrutfull", "orange", "friend", "meaning"]
变为"true truth thrutfull orange friend meaning"
) 并使用len(findall)
查找匹配项的数量。
笔记:
prova
每个品牌相关联的list
没有重复项(或者如果它们有重复项,您有兴趣对出现多次的单词进行多次计数)。 如果不是这种情况,您将需要使用set()
更新' '.join(v1)
set()
以消除重复项。personality
中的字符串是您期望prova
单词的开头方式。 相反,如果您到处寻找匹配项,则需要更新re.compile...
,例如删除\\s?
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.