【问题标题】:How to compute the average of dictionary's value made up of lists,?如何计算由列表组成的字典值的平均值?
【发布时间】:2015-07-31 16:52:05
【问题描述】:

我必须计算字典值列表的平均值:

d={('a'):['-','-',3.2],
   ('b'):[4.8,6.7],
   ('c'):['-'],
   ('d'):[6.7,'-',9.8,'-']}

我想要:

d={('a'):[3.2],
    ('b'):[5.75],
    ('c'):['-'],
    ('d'):[8.25]}

这是我使用的代码:

avgd={}

for key, v in d.iteritems():
    try:
        avgd[key]=sum(v)/(len(v))
    except TypeError:
        avgd[key]='-'

但我只得到列表仅由数字组成的平均值。 如何避免这个问题?

【问题讨论】:

  • 非数字项总是是破折号吗?
  • 在旁注中,您似乎正在尝试实现 numpy.xml 中的掩码数组所涵盖的功能。如果您的实际问题稍微复杂一些,您可能希望研究一下。
  • @SuperBiasedMan,是的,他们总是破折号

标签: python list dictionary average


【解决方案1】:

这是一种方法。我使用列表推导仅获取v 的相关项目。

>>> for key,v in d.iteritems():
    try:
        nums = [i for i in v if i != '-']
        avgd[key] = sum(nums) / len(nums)
    except ZeroDivisionError:
        avgd[key] = '-'


>>> avgd
{'a': 3.2, 'c': '-', 'b': 5.75, 'd': 8.25}

【讨论】:

    【解决方案2】:
    d={('a'):['-','-',3.2],
       ('b'):[4.8,6.7],
       ('c'):['-'],
       ('d'):[6.7,'-',9.8,'-']}
    
    avgd = {}
    
    for key, values in d.iteritems():
        numeric = [float(i) for i in values if isinstance(i,(int,float))]
        avgd[key] = [sum(numeric)/len(numeric)] if numeric else values
    
    # avgd == {'a': [3.2], 'c': ['-'], 'b': [5.75], 'd': [8.25]}
    

    【讨论】:

    • 如果 d 有类似 ('e'): ['-', '-'] 的项目,那么经过处理后 avgd['e'] 将不会是 ['-'],所以我认为您可能应该将值更改为 ['-'] 。 :-)
    • @Alice 我很高兴!请务必使用绿色复选标记标记解决您的问题的答案。
    【解决方案3】:

    通过跳过而不是爆炸。

    {k:('-' if all(e == '-' for e in v) else
      (sum(e for e in v if e != '-') / (sum(1 for e in v if e != '-')) or 1))
      for k, v in d.iteritems()}
    

    优化留给读者练习。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2021-12-03
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多