簡體   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