如何在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)"
。构造该模式以便我稍后可以在没有或一个空格后搜索 tru
或 honest
。我使用这些模式来搜索 prova
中每个品牌值的匹配项。为了计算出现次数,我根据值构造一个字符串(例如 brand1
["true", "truth", "thrutfull", "orange", "friend", "meaning"]
变为 "true truth thrutfull orange friend meaning"
)并使用 len(findall)
查找匹配项数。
备注:
- 我假设
prova
中与每个品牌相关的 list
没有重复项(或者如果它们有重复项,您有兴趣计算多次出现多次的单词) .如果不是这种情况,您将需要使用 set()
更新 ' '.join(v1)
以消除重复项。
- 我还假设
personality
中的字符串是您希望 prova
中的单词开始的方式。相反,如果您到处寻找匹配项,则需要更新 re.compile...
,例如删除 \s?
.
- 您的描述中有错字,即“thrutfull”。这就是为什么即使您期望 personality[sincerity] 中的 “tru”与 prova[brand1] 中的“true”、“truth”、“truthful”匹配,您在上面看到的情况是有 2 场比赛(而不是 3 场)。
我有一本字典,里面有一些性格特征和相关形容词:
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)"
。构造该模式以便我稍后可以在没有或一个空格后搜索 tru
或 honest
。我使用这些模式来搜索 prova
中每个品牌值的匹配项。为了计算出现次数,我根据值构造一个字符串(例如 brand1
["true", "truth", "thrutfull", "orange", "friend", "meaning"]
变为 "true truth thrutfull orange friend meaning"
)并使用 len(findall)
查找匹配项数。
备注:
- 我假设
prova
中与每个品牌相关的list
没有重复项(或者如果它们有重复项,您有兴趣计算多次出现多次的单词) .如果不是这种情况,您将需要使用set()
更新' '.join(v1)
以消除重复项。 - 我还假设
personality
中的字符串是您希望prova
中的单词开始的方式。相反,如果您到处寻找匹配项,则需要更新re.compile...
,例如删除\s?
. - 您的描述中有错字,即“thrutfull”。这就是为什么即使您期望 personality[sincerity] 中的 “tru”与 prova[brand1] 中的“true”、“truth”、“truthful”匹配,您在上面看到的情况是有 2 场比赛(而不是 3 场)。