【问题标题】:Summing up numbers in a defaultdict(list)总结 defaultdict(list) 中的数字
【发布时间】:2014-08-13 21:58:33
【问题描述】:

我一直在尝试让它发挥作用,并且我已经用尽了每一个想法和网络搜索。似乎没有什么办法。我需要在defaultdict(list) 中输入sum 数字,我只需要最终结果,但无论我做什么,我都只能通过迭代并返回所有总和来获得最终结果。我一直在尝试的一般,

d = { key : [1,2,3] }
running_total = 0

#Iterate values
for value in d.itervalues:
  #iterate through list inside value
  for x in value:       
    running_total += x
    print running_total

结果是: 1,3,6 我理解它这样做是因为它遍历 for 循环。我不明白的是,在不使用循环的情况下,我还能如何获得这些列表值中的每一个?还是有什么方法被忽略了?

要清楚,我只想返回最终数字,例如6

编辑我忽略了一个很大的因素,列表中的项目是 timedealta 对象,所以我必须使用 .seconds 将它们变成整数以进行添加。下面的解决方案很有意义,我也尝试过类似的方法,但尝试在 sum 语句中添加 .seconds 转换会引发错误。

d = { key : [timedelta_Obj1,timedelta_Obj2,timedelta_Obj3] }

【问题讨论】:

  • 有什么问题?您是否只想打印出最终结果而不是所有中间结果(只需将打印语句移出循环)?还是您想完全避免 for 循环?
  • 你的问题问得不好。它与defaultdict(list) 几乎没有任何关系,并且示例代码不正确且缩进不正确——即使是您的 EDIT...
  • @martineau 不是QQ缩进不当
  • 如果您想要整个字典的单个总数,print 语句不应该嵌套在 for 循环中——因此缩进在语义上是不正确的。
  • 很抱歉,您的陈述表现不佳。

标签: python python-2.7 sum iteration


【解决方案1】:

我认为这对你有用:

sum(td.seconds for sublist in d.itervalues() for td in sublist)

【讨论】:

  • 令我惊讶的是,这行得通。我原以为它会说 td 未定义,但事实并非如此。明确一点,这里的 sublist 是任意字符串?
  • 是的。这与在不同的行中编写这些语句相同。您将从for sublist in d.itervalues(): 开始,然后在下一行以for td in sublist: 继续。
【解决方案2】:

试试这个方法:

from datetime import timedelta as TD

d = {'foo' : [TD(seconds=1), TD(seconds=2), TD(seconds=3)],
     'bar' : [TD(seconds=4), TD(seconds=5), TD(seconds=6), TD(seconds=7)],
     'baz' : [TD(seconds=8)]}

print sum(sum(td.seconds for td in values) for values in d.itervalues())

【讨论】:

    【解决方案3】:

    您可以只 sum 字典中的每个列表,然后从返回的列表中取出最后一个 sum

    >>> d = {'foo' : [1,2,3], 'bar' : [4,5,6,7], 'foobar' : [10]}
    
    # sum each value in the dictionary
    >>> [sum(d[i]) for i in d]
    [10, 6, 22]
    
    # sum each of the sums in the list
    >>> sum([sum(d[i]) for i in d])
    38
    

    【讨论】:

    • 这会起作用,除非我需要对列表中的每个项目进行.seconds 转换。请参阅编辑,我很抱歉。
    • @Cyber​​:仅供参考,您不需要在求和时明确列出清单。相反,可以执行以下操作:sum(sum(v) for k, v in d.items())
    【解决方案4】:

    如果您不想迭代或使用推导式,您可以使用:

    d = {'1': [1, 2, 3], '2': [3, 4, 5], '3': [5], '4': [6, 7]}
    
    print(sum(map(sum, d.values())))
    

    如果您使用 Python 2 并且您的 dict 有很多键,则最好使用 imap(来自 itertools)和 itervalues

    from itertools import imap
    
    print sum(imap(sum, d.itervalues())) 
    

    【讨论】:

      【解决方案5】:

      您的问题是如何“不使用循环”获取值。好吧,你不能。但是你可以做一件事:使用高性能的itertools

      如果您使用chain,您的代码中将不会有显式循环。 chain 为您管理。

      >>> data = {'a': [1, 2, 3], 'b': [10, 20], 'c': [100]}
      >>> import itertools
      >>> sum(itertools.chain.from_iterable(data.itervalues()))
      136
      

      如果您有 timedelta 对象,您可以使用相同的配方。

      >>> data = {'a': [timedelta(minutes=1), 
                        timedelta(minutes=2), 
                        timedelta(minutes=3)], 
                  'b': [timedelta(minutes=10), 
                        timedelta(minutes=20)], 
                  'c': [timedelta(minutes=100)]}
      >>> sum(td.seconds for td in itertools.chain.from_iterable(data.itervalues()))
      8160
      

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2017-01-31
        • 2015-12-25
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        相关资源
        最近更新 更多