Python 字典只返回for循环中的最后一个键值对
我有一个字符串列表,如下所示:Python 字典只返回for循环中的最后一个键值对,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,我有一个字符串列表,如下所示: 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' ]
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)
但是,它只返回最后一对字典
打印(dic)
您总是使用
dict[j]=t.count(j)
覆盖dictdic
中的现有值。您可以为每个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)
与在示例输出中创建dict列表不同,您只创建一个dict(并在每次检查短语时覆盖单词计数)。您可以使用
re.findall
来计算每个短语中出现的单词(如果您的任何短语包含后跟标点符号的单词,如“希望?”,则不会失败)
为避免覆盖现有值,请检查该条目是否已在字典中。尝试添加:
if j in b:
dic[j] += t.count(j)
else:
dic[j] = t.count(j)
两个问题:您在错误的位置初始化
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}]
试试这个
从集合导入计数器
A=[“费城法院过度失望,法院希望”,
“希望管辖权模糊了无罪释放法庭”,
“提及希望马里兰州信号举行提及问题内部改革生活支持级别申诉”]
B=[‘法庭’、‘希望’、‘提及’、‘生命’、‘支撑’、‘内部’、‘等级’]
result=[{b:dict(计数器(i.split()).get(b,0)for b in b}for i in A]
打印(结果)
输出:
[{'court':2,'hope':2,'提及':0,'life':0,'内部':0,'level':0},{'court':1,'hope':2,'提及':0,'life':0,'level':0,'hope':1,'内部':1,'level':1}]
“我想创建字典”实际上不是真的,您正在尝试创建字典列表。因此需要将字典附加到列表中。还要注意初始化驾驶员信息中心(dic)的位置。请检查我的答案。您可以使用集合稍微改进您的代码。计数器而不是自己显式地计算东西。@Learner当然!请不要忘记接受最有用的答案。谢谢是的,我肯定会的。我只是想问一下,我有一个非常大的字符串列表,长度大约为100000。for循环是否会增加这里的计算时间?@Learner因为你必须在两个列表上迭代,在每个元素上没有例外,我认为双循环是不可避免的。是的,我也使用了你的代码。计算结果花了很长时间。对于同样的问题,你们有更好的方法吗?会是这样的helpful@Learner请查看Python中的并行处理-多线程。通过这种方式,你可以将作业分成若干并行运行的部分,并显著减少时间。我做了一些事情,dic=[]为a:I_dict={}t=I.split()为B中的j:if j in t:I_dict[j]+=t.count(j)else:I_dict[j]=t.count(j)dic.append(I_dict)
给出错误键错误:“法庭”
if j in b:
dic[j] += t.count(j)
else:
dic[j] = t.count(j)
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}]