for循环中不同键的值输出相同

时间:2019-04-21 17:42:40

标签: python python-3.x

我是Python的新手,正试图从具有列表格式值的字典创建新字典。下面请找到我的代码:

dataset = {
    "a" : [3, 1, 7, 5, 9],
    "b" : [4, 8, 7, 5, 3],
    "c" : [3, 4, 1, 0, 0],
    "d" : [0, 5, 1, 5, 5],
    "e" : [3, 7, 5, 5, 1],
    "f" : [3, 6, 9, 2, 0],
}


for v in dataset.values():
    total = (sum(v))
    print(total)
for k in dataset:
    print(k)
dict1 = {k:total for k in dataset}
print(dict1)

我的预期结果是{"a":25, "b":27, ..}

相反,当我运行代码时,输​​出为

{'a': 20, 'b': 20, 'c': 20, 'd': 20, 'e': 20, 'f': 20}

我可以知道我错了哪一部分代码吗?

6 个答案:

答案 0 :(得分:0)

这是因为total被设置为for v in dataset.values()循环中的最后一个值。你应该尝试

dict1={k: sum(v) for k,v in dataset.items()}

答案 1 :(得分:0)

您只是将最后一个total存储在解决方案中。尝试这样做:

dataset = {
    "a" : [3, 1, 7, 5, 9],
    "b" : [4, 8, 7, 5, 3],
    "c" : [3, 4, 1, 0, 0],
    "d" : [0, 5, 1, 5, 5],
    "e" : [3, 7, 5, 5, 1],
    "f" : [3, 6, 9, 2, 0],
}

dict1 = {k: sum(v) for k, v in dataset.items()}
print(dict1)

答案 2 :(得分:0)

“总计”在每次迭代后发生变化。每次您通过字典中的值取和时,您都会得到一个新的总数。因此,当循环结束时,total是字典中最后一个列表的总和。

您要使字典中的每个键都具有最后一个列表的合计值。相反,您应该为要计算总数的循环内的每个键分配总数。

答案 3 :(得分:0)

尝试这个。

dataset = {
    "a" : [3, 1, 7, 5, 9],
    "b" : [4, 8, 7, 5, 3],
    "c" : [3, 4, 1, 0, 0],
    "d" : [0, 5, 1, 5, 5],
    "e" : [3, 7, 5, 5, 1],
    "f" : [3, 6, 9, 2, 0],
}

result = {}
for (k, v) in dataset.items():
    result[k] = sum(v)

print (result)

输出: {'a':25,'c':8,'b':27,'e':21,'d':16,'f':20}

答案 4 :(得分:0)

您要为total中的每个值列表设置一次dataset,但是当您使用字典理解来创建dict1时,仅使用了最后一个计算值total中的一个,恰好是20。(没有排序顺序,所以total可能以您的总和值结尾,具体取决于访问值的顺序是什么。)

相反,您可以使用方便的函数items()将所有操作都一行完成,该函数将字典变成对应键和值的成对(即2个元组)列表。因此,您可以像这样重写dict1代码:

dict1 = {k: sum(v) for (k, v) in dataset.items()}

答案 5 :(得分:0)

运行代码的以下部分时,将针对数据集字典中的每个值更新总计,然后将总计更新为字典中最后一个元素的总和,即[3, 6, 9, 2, 0],因此total=20

for v in dataset.values():
    total = (sum(v))
    print(total)

然后,当您执行dict1 = {k:total for k in dataset}时,dict1的所有值均为20`。

两种简化方法。

  1. 遍历输入字典并同时更新输出字典,这是最有效的
total = []
dict1 = {}
for k, v in dataset.items():
    total = sum(v)
    dict1[k] = total
print(dict1)
#{'a': 25, 'b': 27, 'c': 8, 'd': 16, 'e': 21, 'f': 20}
  1. 遍历值,然后列出所有总和,然后遍历键,并生成输出字典。请注意,这是非常低效的,但可以视为从转到您当前拥有的代码到第一个方法的中间步骤。
total = []
dict1 = {}

#Create the list of sums
for v in dataset.values():
    total.append(sum(v))

idx = 0
#Use that list of sums to create the output dictionary
for k in dataset.keys():
    dict1[k] = total[idx]
    idx+=1
print(dict1)
#{'a': 25, 'b': 27, 'c': 8, 'd': 16, 'e': 21, 'f': 20}