Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典只返回for循环中的最后一个键值对_Python_Python 3.x_List_Dictionary - Fatal编程技术网

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)
覆盖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)

与在示例输出中创建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}]