![](/img/trans.png)
[英]Only left with the last key/value pairs added to a dictionary when I go through a loop in Python
[英]Dictionary returns only last key value pairs inside for loop
我有一個字符串列表:
A = [
'philadelphia court excessive disappointed court hope hope',
'hope hope jurisdiction obscures acquittal court',
'mention hope maryland signal held mention problem internal reform life bolster level grievance'
]
和另一個列表:
B = ['court', 'hope', 'mention', 'life', 'bolster', 'internal', 'level']
我想根據字符串A
列表中列表單詞B
出現次數創建字典。 就像是,
C = [
{'count':2,'hope':2,'mention':0,'life':0,'bolster':0,'internal':0,'level':0},
{'count':1,'hope':2,'mention':0,'life':0,'bolster':0,'internal':0,'level':0},
{'count':0,'hope':1,'mention':2,'life':1,'bolster':1,'internal':1,'level':1}
]
我喜歡什么,
dic={}
for i in A:
t=i.split()
for j in B:
dic[j]=t.count(j)
但是,它只返回最后一對字典,
print (dic)
{'court': 0,
'hope': 1,
'mention': 2,
'life': 1,
'bolster': 1,
'internal': 1,
'level': 1}
您不是像示例輸出中那樣創建一個dicts列表,而是創建一個單獨的dict(並在每次檢查一個短語時覆蓋單詞計數)。 您可以使用re.findall
來計算每個短語中的單詞出現次數(如果您的任何短語包含單詞后跟標點符號,例如“希望?”),則可以不失敗。
import re
words = ['court', 'hope', 'mention', 'life', 'bolster', 'internal', 'level']
phrases = ['philadelphia court excessive disappointed court hope hope','hope hope jurisdiction obscures acquittal court','mention hope maryland signal held mention problem internal reform life bolster level grievance']
counts = [{w: len(re.findall(r'\b{}\b'.format(w), p)) for w in words} for p in phrases]
print(counts)
# [{'court': 2, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 1, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 0, 'hope': 1, 'mention': 2, 'life': 1, 'bolster': 1, 'internal': 1, 'level': 1}]
兩個問題:你是初始化dic
在錯誤的地方,而不是收集那些dic
在列表秒。 這是修復:
C = []
for i in A:
dic = {}
t=i.split()
for j in B:
dic[j]=t.count(j)
C.append(dic)
# Result:
[{'court': 2, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0},
{'court': 1, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0},
{'court': 0, 'hope': 1, 'mention': 2, 'life': 1, 'bolster': 1, 'internal': 1, 'level': 1}]
您始終使用dict[j]=t.count(j)
覆蓋dict dic
的現有值。 您可以為每個i創建一個新的dict,並將其附加到以下列表:
dic=[]
for i in A:
i_dict = {}
t=i.split()
for j in B:
i_dict[j]=t.count(j)
dic.append(i_dict)
print(dic)
要避免覆蓋現有值,請檢查該條目是否已在字典中。 嘗試添加:
if j in b:
dic[j] += t.count(j)
else:
dic[j] = t.count(j)
試試這個,
from collections import Counter
A = ['philadelphia court excessive disappointed court hope hope',
'hope hope jurisdiction obscures acquittal court',
'mention hope maryland signal held mention problem internal reform life bolster level grievance']
B = ['court', 'hope', 'mention', 'life', 'bolster', 'internal', 'level']
result = [{b: dict(Counter(i.split())).get(b, 0) for b in B} for i in A]
print(result)
輸出:
[{'court': 2, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 1, 'hope': 2, 'mention': 0, 'life': 0, 'bolster': 0, 'internal': 0, 'level': 0}, {'court': 0, 'hope': 1, 'mention': 2, 'life': 1, 'bolster': 1, 'internal': 1, 'level': 1}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.