我正在尝试汇总字典中每个键的所有值。到目前为止,我正在使用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'
我知道这是因为我有一个列表的列表,但是就像我如何转换它或像求和一样
我对此一直感到头疼
答案 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