Python函数,返回两个dicts值的总和

时间:2015-10-10 13:57:04

标签: python python-2.7 dictionary

我应该使用function从下面的词典中获取国家/地区标识符,并返回两个长度不等的dictonaries的值。此外,dicts应该有不同的权重(请参阅下面的信息)。如果其中一个dicts没有关于特定国家/地区的信息(例如,dict y没有关于USA的任何信息),则只应使用一个值(例如dict x确实有关于USA的信息,因此输出功能应该是12.1)。例如:

词典一:

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

字典二:

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

总结function的标准:

  • 输入=国家/地区标识符
  • 输出=属于某个国家/地区的值的总和
  • 计算总和时,每个字典的值应具有不同的权重。 Dict Y的重量为0.8。 Dict 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'

1 个答案:

答案 0 :(得分:2)

您可以使用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]))