在Python中排序嵌套的defaultdicts

2024-05-18 08:44:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我嵌套了两个级别的默认dict。内部dict包含许多字段,我想按其中一个值对其排序,并删除与最低值相对应的条目。你知道吗

下面是一个简化的代码示例:

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']。你知道吗

它嵌套的原因是因为我将在外部dict中循环其他条目


Tags: lambdadatasize排序条目somedescdict
2条回答

试试这个:

>>> 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)]

reduce语句用于将嵌套列表[[a],[b,c],[d]]转换为[a,b,c]。你知道吗

sorted语句的键参数指定对(k,k1,val)ie,val的(包含零的)第二个参数进行排序

反向参数按降序排列列表。你知道吗

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

如果你不在乎目录项对于Python2/3,您还可以将其编写为

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

相关问题 更多 >