我应该使用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
的标准:
我尝试了以下代码,但它不起作用:
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'
答案 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.get
和y.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]))