热线电话:13121318867

登录
2019-02-19 阅读量: 717
根据箱子组合字典键

我有一本字典,

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。

0.0000
1
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子