具有元组键的字典中的平均值



我正在尝试按城市查找字典值的平均值。就本练习而言,我不能使用numpy或pandas。

以下是一些示例数据:

d = {
('Chicago', 2006): 23.4,
('Chicago', 2007): 73.4,
('Dallas', 2008): 70.8,
('Paris', 2010): 5.6,
('Paris', 2011): 63.3)
}

这是理想的输出:

city_averages = {
'Chicago': 48.4,
'Dallas': 70.8,
'Paris': 139.7
}

这是我试过的代码。

city_averages = {}

total = 0
for k,v in d.items():
total += float(v) 
city_averages[k[0]] = total 


你可以做一些更简单的事情,比如:

d = {
('Chicago', 2006): 23.4,
('Chicago', 2007): 73.4,
('Dallas', 2008): 70.8,
('Paris', 2010): 5.6,
('Paris', 2011): 63.3,
('Paris', 2011): 100.4
}
dnew = {}
for k,v in d.items():
if k[0] in dnew:
dnew[k[0]] += v 
else:
dnew[k[0]] = v
print (dnew)

您将得到如下输出:

{'Chicago': 96.80, 'Dallas': 70.8, 'Paris': 169.3}

在打印数据之前,您需要对数据进行格式化。

我将让你来找出寻找平均值的逻辑。这将帮助您更接近完整的答案。

平均计算的答案:

这是包含平均值计算的代码。这不使用任何复杂的逻辑。

dnew = {}
dcnt = {}
for k,v in d.items():
dnew[k[0]] = dnew.get(k[0], 0) + v
dcnt[k[0]] = dcnt.get(k[0], 0) + 1
for k,v in dnew.items():
dnew[k] /= dcnt[k]
print (dnew)

输出如下:

{'Chicago': 48.400000000000006, 'Dallas': 70.8, 'Paris': 56.43333333333334}

这里有一个非常相似的问题

在您的情况下,代码如下:

from collections import defaultdict
import statistics
d = {
('Chicago', 2006): 23.4,
('Chicago', 2007): 73.4,
('Dallas', 2008): 70.8,
('Paris', 2010): 5.6,
('Paris', 2011): 63.3
}
grouper = defaultdict(list)
for k, v in d.items():
grouper[k[0]].append(v)
city_averages = {k: statistics.mean(v) for k,v in grouper.items()}
print(city_averages)

接下来,我将提供两个版本的一行代码——第一个是使用itertools.groupby的简单代码,第二个是不使用任何额外模块的更复杂代码。

在线试用!

import itertools
d = {
('Chicago', 2006): 23.4,
('Chicago', 2007): 73.4,
('Dallas', 2008): 70.8,
('Paris', 2010): 5.6,
('Paris', 2011): 63.3,
}
print({k : sum(e[1] for e in lg) / len(lg) for k, g in itertools.groupby(sorted(d.items()), lambda e: e[0][0]) for lg in (list(g),)})

接下来,我在不使用任何模块(如itertools(的情况下创建了一个漂亮的单行代码,只是普通的python,它在时间复杂性方面与上面使用itertools.groupby的代码一样高效。这个代码只是为了娱乐目的,或者当你真的需要一个不使用任何模式的单行代码时:

在线试用!

d = {
('Chicago', 2006): 23.4,
('Chicago', 2007): 73.4,
('Dallas', 2008): 70.8,
('Paris', 2010): 5.6,
('Paris', 2011): 63.3,
}
print({k : sm / cnt  for sd in (sorted(d.items()),) for i in range(len(sd)) for k, cnt, sm in ((sd[i][0][0] if i + 1 >= len(sd) or sd[i][0][0] != sd[i + 1][0][0] else None,) + ((1, sd[i][1]) if i == 0 or sd[i - 1][0][0] != sd[i][0][0] else (cnt + 1, sm + sd[i][1])),) if k is not None})

最新更新