【问题标题】:Python function that returns the sum of values of two dicts返回两个dict的值之和的Python函数
【发布时间】:2015-10-10 13:57:03
【问题描述】:

我应该做什么function 从下面的字典中获取一个国家标识符并返回两个长度不等的字典的值之和。此外,dicts 的权重应该不同(在下面找到信息)。如果其中一个字典没有关于特定国家的信息(例如,字典 y 没有关于美国的任何信息),那么应该只使用一个值(例如,字典 x 确实有关于美国的信息,因此输出功能应为 12.1)。例如:

字典一:

x = {'USA':12.1, 'AUS':11.2, 'IND':10.3}

字典二:

y = {'AUS': 9.4, 'IND': 8.3}

总结function的条件:

  • 输入 = 国家标识符
  • 输出 = 属于某个国家/地区的值的总和
  • 在计算总和时,每个字典的值应该有不同的权重。字典 Y 的权重为 0.8。字典 X​​ 的权重为 0.2。
  • 函数应该是可迭代的,因为它将在另一个函数中使用,该函数可以查看两个给定的巨大字典。

我尝试了以下代码,但它不起作用:

def sum_dict_values(key): temp1 = (d.get(key, 0) for d in (x)) temp2 = (d.get(key, 0) for d in (y)) return sum(0.8*temp1, 0.2*temp2)

运行时

sum_dict_values("USA")

我得到错误:

TypeError: unsupported operand type(s) for *: 'float' and 'generator'

【问题讨论】:

    标签: python python-2.7 dictionary


    【解决方案1】:

    您可以使用sum 获取总和,并使用get 从字典中获取一个值,或者如果该值不存在,则使用默认值。

    >>> x = {'USA':12.1, 'AUS':11.2, 'IND':10.3}
    >>> y = {'AUS': 9.4, 'IND': 8.3}
    >>> sum(d.get("USA", 0) for d in (x, y))
    12.1
    >>> sum(d.get("AUS", 0) for d in (x, y))
    20.600000000000001
    

    把它放在一个函数中(对不起,我认为这很明显):

    def sum_dict_values(key, dict1, dict2):
        return sum(d.get(key),0) for d in (dict1, dict2))
    

    或者让它成为一个 var-args 函数,这样你就可以传递任意数量的字典:

    def sum_dict_values(key, *dictionaries):
        return sum(d.get(key, 0) for d in dictionaries)
    

    两个版本都可以这样调用:sum_dict_values("AUS", x, y)


    关于您更新的问题:问题在于 temp1 = (d.get(key, 0) for d in (x)) 是一个生成器(试图在字典中的 上调用 get),并且您不能将生成器与浮点数相乘.您根本不需要这些生成器,只需直接调用x.gety.get。另外,如果你总是只有这两个字典,你不需要sum,而可以使用+

    def sum_dict_values(key):
        return 0.8 * x.get(key, 0) + 0.2 * y.get(key, 0)
    

    如果您只想将该函数与这两个字典和那些确切的权重一起使用,那很好,但您也可以使其更通用,例如,对于任意数量的字典和相应的权重:

    def sum_dict_values(key, dictionaries, weights):
        return sum(w * d.get(key, 0) for d, w in zip(dictionaries, weights))
    

    并像这样使用它:sum_dict_values("USA", [x, y], [0.8, 0.2]))

    【讨论】:

    • 真的不明白我如何将它用作两个(其他)巨大字典的函数,我不知道其中一个字典中没有代表哪些国家。您的代码适用于这两个特定的字典,但我正在寻找一个可以在其他两个字典上运行的函数。谢谢。
    • @TjeerdTim dict .get 方法允许您返回字典中不存在的键的默认值。确实存在的键基本上与您的问题无关。您使用.get 方法来处理不存在的键。
    • @DavidZemens。您是否也碰巧知道如何在此函数中为两个 dicts 使用不同的权重? dict1 的值应加权 0.2,dict2 的值应加权 0.8。所以总和应该是0.2 * value of dict1 + 0.8 value of dict2
    • 当然@TjeerdTim 是可能的,但这会改变问题的范围......您只需将另一个参数序列传递给函数,然后将d.get(key, 0) 乘以相应的权重。你为什么不试一试??展示您尝试过的内容(通过修改上面的 Q)...
    • 努力。谢谢。试图在没有太多帮助的情况下做到这一点,以便更好地理解 python。所以这就是部分 q 的原因。生病更新Q..
    猜你喜欢
    • 2019-10-14
    • 2012-04-02
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多