Python:字典格式化为图表列表

时间:2014-12-11 15:48:38

标签: python sorting dictionary

我需要一些帮助将字典格式化为可以在图形情况下使用的输出。这是我到目前为止的代码,它所做的只是对字典中的值求和并将它们返回到列表中:

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) ]

等等,数字不正确,但这是我需要的格式

我试图以各种方式格式化字典,但我没有运气,如果有人能帮助我,我会非常感激,谢谢

4 个答案:

答案 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)

你的代码已经为你提供了你想要的东西......