[英]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.