我有一本字典,
myDict = {1: 10, 1.1: 10, 2: 15, 2.1: 20}
但它只有4个键值对,它有成千上万个,有些非常接近,就像我的例子中的键1和键1.1有时候直到机器epsilon。
有没有一个简单的程序,我可以将键加在一起,同时添加相应的值?在我的binwidth 1示例中,这将成为
myBinnedDict = {1.05: 20, 2.05: 35}
我选择密钥作为前一个密钥的平均值(甚至可以用相应密钥的值加权,但由于这是特定于应用程序的,因此在这里并不重要。)
谢谢您的帮助。
PS:我知道我最终在这里因为我可能没有完全使用数据结构
解决办法:可以使用itertools.groupby一些单行理解:
from itertools import groupby
from statistics import mean
myDict = {1: 10, 1.1: 10, 2: 15, 2.1: 20}
{mean(keys): sum(vals) for keys, vals in (zip(*g) for _, g in groupby(sorted(myDict.items()), key=lambda x: round(x[0])))}
任何舍入到相同整数的东西都将组合在一起。
说明:
{
mean(keys): sum(vals)
for keys, vals in (
zip(*g) for _, g in groupby(
sorted(myDict.items()),
key=lambda x: round(x[0])
)
)
}
sorted(myDict.items()) 按键对字典进行排序(按字典顺序排序,密钥首先排序)。
groupby(sorted(myDict.items()), key=lambda x: round(x[0])))} 按舍入键的值对排序的项目进行分组。
zip(*g) for _, g in groupby(...)转移群体吐出groupby。groupby产生两件事:我们不需要的“键”(圆形数字)(表示为_)和“group”,它的格式是(key, val), (key, val), (key, val), etc.将它zip(*)转换成(key, key, key, ...), (val, val, val, ...)我们需要的。
最后,分别mean(keys): sum(vals) for keys, vals in (...)通过应用mean和转换键和值sum。








暂无数据