【问题标题】:Dictionary operation on a list of items对项目列表的字典操作
【发布时间】:2016-09-27 15:54:48
【问题描述】:

我有一本字典

{ 'a': 1.0,
  'b': 1.1,
  'c': 0.9,
  # ...
  'z': 0.97
}

我有一个项目列表,比如['a', 'b', 'c']。我想从字典中找到这个列表的平均值。当然,我可以遍历我的列表,找到并求和这些值,但是有没有一种方法可以在没有 for 循环的情况下得到它?

【问题讨论】:

  • 你可以使用递归而不是循环。这样就够了吗?

标签: python performance dictionary hash iterator


【解决方案1】:

有一个循环。但是,您可以隐藏循环。

您可以使用operator.itemgetter() object 为您执行此操作,例如:

from operator import itemgetter

average = sum(itemgetter(*list_of_keys)(your_dictionary)) / len(list_of_keys)

绝对明确:itemgetter() 现在循环遍历您的键列表并生成具有相应值的元组。

另一个“隐藏”循环是map() function;使用dict.get()dict.__getitem__() 作为要映射到的函数,map() 再次为您完成所有循环:

avegare = sum(map(your_dictionary.__getitem__, list_of_keys)) / len(list_of_keys)

dict.getdict.__getitem__ 之间的区别是缺少密钥时出现的异常;第一个将导致TypeError,因为您最终尝试将None 和一个数字相加,另一个会给您一个KeyError

否则,只需在生成器表达式中使用循环:

average = sum(your_dictionary[k] for k in list_of_keys) / len(list_of_keys)

演示:

>>> from operator import itemgetter
>>> d = {'a': 1.0, 'z': 0.97, 'c': 0.9, 'b': 1.1}
>>> selected = ['a', 'b', 'c']
>>> sum(itemgetter(*selected)(d)) / len(selected)
1.0
>>> sum(map(d.__getitem__, selected)) / len(selected)
1.0
>>> sum(d[k] for k in selected) / len(selected)
1.0

【讨论】:

    【解决方案2】:

    如果你使用的是 python3,你可以使用 statistics.mean:

    d = { "a": 1.0,
      "b": 1.1,
      "c": 0.9,
    
      "z": 0.97
    }
    
    lst = ["a", "b", "c"]
    from statistics import mean
    
    
    print(mean(map(d.get, lst)))
    

    或者只使用总和:

    print(sum(map(d.get, lst)) / len(lst))
    

    假设 lst 中的所有项目都在 dict 中,否则添加浮点数和 NoneType 会出错。

    【讨论】:

    • 请注意map() 也会循环! :-)
    • @MartijnPieters,我认为无论你做什么,都会有一个循环;)
    • 没错,但这是问题的根源。
    【解决方案3】:

    如果您的字典名为values,而您的列表名为items,则有一个非常简短的解决方案:

    arithmetic_mean_inexact = sum(values[i] for i in items) / len(items)
    

    请注意,这不支持空的items 列表,因为这将导致ZeroDivisionError。这很好,因为空序列的平均值没有真正意义。

    虽然此解决方案表明在没有 显式 for 循环的情况下计算平均值是可能的,但它存在的问题是,将一大堆浮点数相加并将其除以一个大数字会导致数值精度损失.解决这个问题并非易事,需要更长的解决方案。幸运的是,Python 3.4(或更高版本)为此提供了统计模块,因此您应该使用statistics.mean()(正如另一个答案已经提出的那样)。例如:

    from statistics import mean
    arithmetic_mean = mean([values[i] for i in items])
    

    根据您的具体问题,此函数中的其他函数可能更合适。您将在documentation of the statistics module 中找到更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2016-08-24
      • 2018-05-10
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多