【问题标题】:how to accumulate the value according to the key in a defaultdict如何根据defaultdict中的键累积值
【发布时间】:2013-02-03 12:50:47
【问题描述】:

如果我有一个 defaultdict(list)

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

......我如何将其转换为类似的 defaultdict(list) 哪些值是具有相同键的第一个字典的值的累积,但从不大于 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)

【问题讨论】:

  • Defaultdict 允许模棱两可的键?如果你打电话给d [1],它会产生什么? 0、0.2 还是 0.3?

标签: python map iterator key defaultdict


【解决方案1】:

原始帖子有点混乱:这些示例看起来像一个多图而不是列表的字典。

我假设您有一个包含数字列表的 defaultdict,并且您想创建一个新的 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

请注意,当您添加新值时,新的 defaultdict 不会自动计算累积总和。

如果您安装了 numpy 之类的库,则可以使用 numpy.cumsum 而不是使用 python 循环来计算累积和。

我不清楚您所说的“从不大于 1”到底是什么意思。累积和达到 1 后是否要忽略元素?您是否要忽略大于 1 的单个值,但继续累积较小的值,即使总和超过 1?您是否希望每个输出列表中的元素数量相同,但将元素值限制为 1?

【讨论】:

  • 非常感谢,很有帮助
  • 在我的数据集中,累积值不应大于 1,这将是我之前数据生成过程的第二次检查..但与这个特定问题不太相关。 numpy.cumsum 可能是个好主意:-)
【解决方案2】:

作为参考,您可以更优雅地执行此操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多