我正在创建一个函数,该函数应该返回包含来自不同列表的键和值的字典。但是我在将列表的平均值作为字典的值时遇到了问题。但是,我认为我正确地获得了密钥。 这是我到目前为止所得到的:
def exp (magnitudes,measures):
"""return for each magnitude the associated mean of numbers from a list"""
dict_expe = {}
for mag in magnitudes:
dict_expe[mag] = 0
for mea in measures:
summ = 0
for n in mea:
summ += n
dict_expe[mag] = summ/len(mea)
return dict_expe
print(exp(['mag1', 'mag2', 'mag3'], [[1,2,3],[3,4],[5]]))
输出应为:
{mag1 : 2, mag2: 3.5, mag3: 5}
但我得到的总是5作为所有键的值。我想到了zip()方法,但我试图避免它,因为它在两个列表中都需要相同的长度。
答案 0 :(得分:0)
序列的平均值为sum(sequence) / len(sequence)
,因此您需要遍历magnitudes
和measures
,计算这些均值(算术平均值)并将其存储在字典中。
你可以通过更多的pythonic方式实现这一目标。所有这些示例都会产生{'mag1': 2.0, 'mag2': 3.5, 'mag3': 5.0}
。
使用for i in range()
循环:
def exp(magnitudes, measures):
means = {}
for i in range(len(magnitudes)):
means[magnitudes[i]] = sum(measures[i]) / len(measures[i])
return means
print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))
但是如果你需要列表的索引和值,你可以使用for i, val in enumerate(sequence)
方法,在这种情况下更合适:
def exp(magnitudes, measures):
means = {}
for i, mag in enumerate(magnitudes):
means[mag] = sum(measures[i]) / len(measures[i])
return means
print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))
另一个问题隐藏在此处:i
索引属于magnitudes
,但我们也从measures
使用它获取值,如果您有{{magnitudes
,这不是什么大问题1}}和measures
长度相同,但如果magnitudes
更大,您将得到IndexError
。所以在我看来,使用zip
函数是最好的选择(实际上,对于python3.6,它不需要两个列表长度相同,它只会使用长度最短的一个作为结果的长度):
def exp(magnitudes, measures):
means = {}
for mag, mes in zip(magnitudes, measures):
means[mag] = sum(mes) / len(mes)
return means
print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))
请随意使用符合您要求的示例,并且不要忘记添加文档字符串。
你很可能不需要这样的pythonic 方式,但当字典理解发挥作用时,它可能更短:
def exp(magnitudes, measures):
return {mag: sum(mes) / len(mes) for mag, mes in zip(magnitudes, measures)}
print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))