如何在defaultdict中根据键累加值

3 投票
2 回答
2226 浏览
提问于 2025-04-17 16:18

如果我有一个默认字典,里面的值是列表

from collections import defaultdict

d =defaultdict(list)
such as 1: 0
        1:0.2
        1: 0.3
        2: 0.2
        2: 0.4
        2: 0.1

......我该如何把它变成一个类似的默认字典,里面的值是第一个字典中相同键的值的累加,但累加的结果不能超过1

        1: 0
        1: 0.2
        1: 0.5
        2: 0.2
        2: 0.6
        2: 0.7 
         .....

我目前只有以下代码,但这并不完全正确 :-(

 d2 = defaultdict(list)
 for k in d.iterkeys()
          v +=d(k)
          d2[k]. append(v)


  

2 个回答

1

作为参考,你可以用更优雅的方式来实现这个:

from collections import defaultdict

d2 = defaultdict(float)
for k, v in d.iteritems():
    d2[k] += v
1

原来的帖子有点让人困惑:示例看起来更像是一个多重映射,而不是一个包含列表的字典。

我猜你的意思是你有一个默认字典,里面存放的是数字的列表,你想创建一个新的默认字典,里面存放的是每个列表的累积和。可以试试这个:

from collections import defaultdict

d2 = defaultdict(list)
for k, v in d.iteritems():
    sum = 0.0
    v2 = []
    for x in v:
        sum += x
        v2.append(sum)
    d2[k] = v2

注意,新创建的默认字典不会在你添加新值时自动计算累积和。

如果你安装了像numpy这样的库,可以使用numpy.cumsum来计算累积和,而不是用Python的循环。

我不太明白你说的“从不大于1”具体是什么意思。你是想在累积和达到1后忽略后面的元素吗?还是说想忽略单个大于1的值,但继续累积小于1的值,即使总和超过1?还是说你希望每个输出列表中的元素数量相同,但把元素值限制在1以内?

撰写回答