我嵌套了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']
。
它嵌套的原因是因为我会循环通过外部字典中的其他条目。
仅供参考,'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
或者你完全避免嵌套; ()(k(k,k1,v1 ['size'))for k,v in sampleDict.items()for k1,v1 in v.items()),key = operator.itemgetter(2),reverse = True )'也应该可以工作,甚至可以避免嵌套结构。 – ShadowRanger