2016-03-02 53 views
0

我嵌套了2个级别的默认词典。内部字典包含许多字段,我想按其中一个值对其进行排序,并删除对应于最低值的条目。在Python中对嵌套的defaultdicts进行排序

这里有一个简单的代码示例:

from collections import defaultdict 

sampleDict = defaultdict(lambda: defaultdict(lambda:defaultdict(lambda:str))) 

sampleDict['keyA']['keyB']['size'] = 1000 
sampleDict['keyA']['keyC']['size'] = 500 
sampleDict['keyA']['keyD']['size'] = 750 
sampleDict['keyA']['keyE']['size'] = 250 
sampleDict['keyA']['keyB']['desc'] = 'some data' 
sampleDict['keyA']['keyC']['desc'] = 'some more data' 
sampleDict['keyA']['keyD']['desc'] = 'different data' 
sampleDict['keyA']['keyE']['desc'] = 'other data' 

在这种情况下,我想排序,然后找出最高size['keyA']['keyB']和第二最高的是['keyA']['keyD']然后取出['keyA']['keyC']['keyA']['keyE']

它嵌套的原因是因为我会循环通过外部字典中的其他条目。

回答

1

试试这个:

>>> import operator 
>>> sorted(
...  reduce(operator.add, 
...  [[(k, k1, sampleDict[k][k1]['size']) for k1 in v.keys()] 
...    for k,v in sampleDict.items()] 
... ), 
...  key=lambda x: x[2], reverse=True) 
[('keyA', 'keyB', 1000), ('keyA', 'keyD', 750), ('keyA', 'keyC', 500), ('keyA', 'keyE', 250)] 

的减少语句用来打开嵌套列表[[a],[b,c],[d]][a,b,c]

排序语句的关键参数指定对(k,k1,val)(即含val)的第二个参数(即val)进行排序。

反转参数按降序排列列表。

+1

仅供参考,'itertools.chain.from_iterable'将更加扁平化值有效而不是'reduce' +'operator.add'(它必须产生大量的中间'list's)。对于k1来说,排序(itertools.chain.from_iterable([(k,k1,v1 ['size']),v.items()]中的v1,sampleDict.items()中的v,key = operator.itemgetter (2),reverse = True)'会更快,涉及更少的中间列表和更少的查找。 – ShadowRanger

+2

或者你完全避免嵌套; ()(k(k,k1,v1 ['size'))for k,v in sampleDict.items()for k1,v1 in v.items()),key = operator.itemgetter(2),reverse = True )'也应该可以工作,甚至可以避免嵌套结构。 – ShadowRanger

2
>>> import heapq 
>>> [(k, heapq.nlargest(2, sampleDict[k], lambda x: sampleDict[k][x]['size'])) 
... for k in sampleDict] 
[('keyA', ['keyB', 'keyD'])] 

如果你不关心的Python2/3 dict.items之间的区别,你也可以把它写成

>>> [(k, heapq.nlargest(2, v, lambda x: v[x]['size'])) for k,v in sampleDict.items()] 
[('keyA', ['keyB', 'keyD'])] 
相关问题