我需要一些帮助将字典格式化为可以在图形情况下使用的输出。这是我到目前为止的代码,它所做的只是对字典中的值求和并将它们返回到列表中:
def total(contestant):
results = contestant[1]
results.sort()
del results[-1]
return sum(results)
d = {"Alice": [1, 2, 3, 1, 3, 5], "Bob": [5, 2, 4, 1, 3, 5], "Clare": [1, 2, 3, 3, 4, 5], "Dennis": [2, 2, 3, 3, 3, 3], "Eva": [2, 2, 2, 1, 3, 3]}
# This is the dictionary that needs to be formatted
y = []
for item in d.items():
y.append(total(item)) # total is a function that sums the integers
print(y)
在对D中的整数求和并首先按最低分数排序后,此循环返回以下内容:
[13, 15, 16, 18, 20]
然而,这对我来说并不适用,我需要的是以下内容:
data = [ ("Eva", 20), ("Bob", 22),("Dennis", 11), ( "Alice", 28), ( "Clare, 28) ]
等等,数字不正确,但这是我需要的格式
我试图以各种方式格式化字典,但我没有运气,如果有人能帮助我,我会非常感激,谢谢
答案 0 :(得分:0)
您需要<{> 1>}上的 迭代 ,然后将key, value pairs
中的密钥和sum of values
附加为list
tuple
提供结果:
y = []
for key, item in d.iteritems():
y.append((key,sum(item))) # total is a function that sums the integers
print(y)
可以使用[('Clare', 18), ('Eva', 13), ('Bob', 20), ('Dennis', 16), ('Alice', 15)]
以更简单的方式完成,并使用内置list comprehension
函数计算值的总和:
sum
根据>>> d = {"Alice": [1, 2, 3, 1, 3, 5],
... "Bob": [5, 2, 4, 1, 3, 5],
... "Clare": [1, 2, 3, 3, 4, 5],
... "Dennis": [2, 2, 3, 3, 3, 3],
... "Eva": [2, 2, 2, 1, 3, 3]}
>>> print [(k, sum(v)) for k,v in d.iteritems()]
[('Clare', 18), ('Eva', 13), ('Bob', 20), ('Dennis', 16), ('Alice', 15)]
获取结果:
Name
根据print sorted(y, key=lambda x: x[0])
[('Alice', 15), ('Bob', 20), ('Clare', 18), ('Dennis', 16), ('Eva', 13)]
对结果进行排序。
sum of items
答案 1 :(得分:0)
这将按照您想要的分数排序:
import operator
d = {"Alice": [1, 2, 3, 1, 3, 5], "Bob": [5, 2, 4, 1, 3, 5], "Clare": [1, 2, 3, 3, 4, 5], "Dennis": [2, 2, 3, 3, 3, 3], "Eva": [2, 2, 2, 1, 3, 3]}
print sorted(((k, sum(v)) for k,v in d.items()), key=operator.itemgetter(1))
[('Eva', 13), ('Alice', 15), ('Dennis', 16), ('Clare', 18), ('Bob', 20)]
答案 2 :(得分:0)
您可以使用lambda函数,map,sum和sorted:
d = {"Alice": [1, 2, 3, 1, 3, 5],
"Bob": [5, 2, 4, 1, 3, 5],
"Clare": [1, 2, 3, 3, 4, 5],
"Dennis": [2, 2, 3, 3, 3, 3],
"Eva": [2, 2, 2, 1, 3, 3]}
res = sorted(map(lambda k: (k, sum(d[k])), d), key=lambda pos: pos[1])
print res
这会给你:
[('Eva', 13), ('Alice', 15), ('Dennis', 16), ('Clare', 18), ('Bob', 20)]
<强>解释强>:
map(lambda k: (k, sum(d[k])), d)
map将在dict d中的每个元素中应用lambda函数,返回包含(dict_key,sum_of_dict_key_values)形式的元组的列表; sorted
将使用每个元组的第二个(索引1)位置的值作为排序键对返回的列表进行排序; 答案 3 :(得分:0)
我对这条线感到有点困惑
del results[-1]
在您的代码中,因为您正在破坏性地修改字典内容,但无论如何,您的目的似乎是在汇总之前从每个列表中删除较高的分数。
如果我对你的帖子的解释是正确的,那么这段代码应该适合你
>>> d = {"Alice": [1, 2, 3, 1, 3, 5],
... "Bob": [5, 2, 4, 1, 3, 5],
... "Clare": [1, 2, 3, 3, 4, 5],
... "Dennis": [2, 2, 3, 3, 3, 3],
... "Eva": [2, 2, 2, 1, 3, 3]}
>>>
>>> [(k,sum(sorted(v)[:-1])) for k, v in d.items()]
[('Clare', 13), ('Eva', 10), ('Bob', 15), ('Dennis', 13), ('Alice', 10)]
>>>
但它与你的不同,因为它没有副作用。
如果您修改了return
total
声明,请忘记提及
return contestant[0], sum(results)
你的代码已经为你提供了你想要的东西......