无法获得字典中的总和

时间:2019-04-07 18:47:44

标签: python python-3.x defaultdict

我正在尝试汇总字典中每个键的所有值。到目前为止,我正在使用defaultdict,这是我的字典: scores = {10: [[1000], [1000]], 25: [[500],[500],[500]], 40: [[600]], 60: [[700]]}

我想要它,以便10: 2000 20: 1500

这是我的代码: finalScores = {k:sum(v) for k,v in scores.items()}

但是,相反,我收到此错误:unsupported operand type(s) for +: 'int' and 'list'

我知道这是因为我有一个列表的列表,但是就像我如何转换它或像求和一样

我对此一直感到头疼

5 个答案:

答案 0 :(得分:2)

使用itertools.chain展平每个列表。

from itertools import chain
{k: sum(chain.from_iterable(v)) for k, v in scores.items()}

chain.from_iterable是一个类方法,给定类似[[a,b,c], [d,e,f]]的情况,它会生成一个迭代器,该迭代器依次从每个子列表中产生值。

答案 1 :(得分:0)

如果无法更改输入,则可以使用递归函数,该函数将对列表列表(或更深层次)中的所有值求和。

def sum_list(l):
    if isinstance(l, int):
        return l
    else:
        return sum(map(lambda x: sum_list(x), l))


scores = {10: [[1000], [1000]], 25: [[500], [500], [500]], 40: [[600]], 60: [[700]]}
result = {k: sum_list(v) for k,v in scores.items()}

print(result)
  
    

{10:2000,25:1500,40:600,60:700}

  

答案 2 :(得分:0)

在汇总之前用sum(v,[])整理列表列表:

scores = {10: [[1000], [1000]], 25: [[500],[500],[500]], 40: [[600]], 60: [[700]]}
finalScores = {k:sum(sum(v,[])) for k,v in scores.items()}
print(finalScores)

输出:

{10: 2000, 25: 1500, 40: 600, 60: 700}

答案 3 :(得分:0)

如果要将单个函数应用于将全部对该函数做出响应的对象列表,则需要调用map()

map(sum, [[1,2,3],[2,3,4]]) # => [5, 9] ... sort of*

Python程序员通常更喜欢使用列表理解功能:

[sum(list) for list in list_of_lists]

这与您已经在执行的dict理解非常相似,可以像这样组合:

{k: sum(l) for (k, ll) in scores.items() for l in ll}

或在其他地方也分为一些逻辑。

我不太确切地知道列表嵌套的最内层是什么,因为似乎所有的最内层列表都是单例。我想这可能只是因为您的示例,但是值得一看的是,您是否可以重构为只需要一层嵌套。

最后一点,通常在处理列表列表时,最好查看stdlib中古老的itertools模块,或者像more-itertools这样更全面的分支。因此碰巧提供了flatten()函数! (尽管正如另一个回答者指出的那样,您可以使用chain.from_iterable来实现itertools的相同功能)

* map()的警告是它实际上返回了一个map对象,该对象将迭代映射的值。

答案 4 :(得分:0)

一种R解决方案:

numpy