我有一个字典,如下所示:
bigdict = {
'a': {'foo':2, 'bar':3, 'baz':7, 'qux':1},
'b': {'foo':6, 'bar':4, 'baz':3, 'qux':0},
'c': {'foo':4, 'bar':5, 'baz':1, 'qux':6}
}
对于每个字典,我希望能够获取具有最高值的2个键并将结果放入新字典中。
e.g。
newbigdict = {
a: {'baz':7, 'bar':3},
b: {'foo': 6, 'bar':4},
c: {'qux':6, 'bar':5}
}
有什么想法吗?我已经坚持了一段时间。我使用Python 3。
答案 0 :(得分:1)
使用dictionary comprehension.可以轻松解决此问题。有关Python Dictionary Comprehension
的更多说明,请参阅此帖子>>> def findtoptwo(d):
... toptwo = sorted(d.values())[-2:]
... return {k:v for k,v in d.items() if v in toptwo}
...
>>> newdict = {k:findtoptwo(v) for k,v in bigdict.items()}
>>> newdict
{'a': {'bar': 3, 'baz': 7}, 'c': {'qux': 6, 'bar': 5}, 'b': {'foo': 6, 'bar': 4}}
这里的逻辑很简单,对于字典中的每个键值对,我们检查值是否存在于前两个值中。为此,我们对字典值进行排序并对最后两个值进行切片。详细了解slices in python here和内置sorted
here。
答案 1 :(得分:0)
可以使用pandas模块轻松完成:
In [97]: bigdict = {
....: 'a': {'foo':2, 'bar':3, 'baz':7, 'qux':1},
....: 'b': {'foo':6, 'bar':4, 'baz':3, 'qux':0},
....: 'c': {'foo':4, 'bar':5, 'baz':1, 'qux':6},
....: }
In [98]: df = pd.DataFrame.from_dict(bigdict)
In [99]: df
Out[99]:
a b c
bar 3 4 5
baz 7 3 1
foo 2 6 4
qux 1 0 6
In [126]: df.apply(lambda x: x.nlargest(2).to_dict()).to_dict()
Out[126]:
{'a': {'bar': 3, 'baz': 7},
'b': {'bar': 4, 'foo': 6},
'c': {'bar': 5, 'qux': 6}}
<强>单行:强>
In [129]: (pd.DataFrame.from_dict(bigdict)
.....: .apply(lambda x: x.nlargest(2).to_dict())
.....: .to_dict()
.....: )
Out[129]:
{'a': {'bar': 3, 'baz': 7},
'b': {'bar': 4, 'foo': 6},
'c': {'bar': 5, 'qux': 6}}