按最高项目号对 defaultdict(list) 进行排序
Posted
技术标签:
【中文标题】按最高项目号对 defaultdict(list) 进行排序【英文标题】:sort a defaultdict(list) by highest item number 【发布时间】:2022-01-22 13:41:42 【问题描述】:我通过运行一些分析创建了以下代码,并将结果放入 defaultdict(list) 中。之后,我将结果放入 csv 文件中。我想对我返回的值进行排序,以便更重要的项目排在最前面。
我想按 "Check1" 从大到小对我的 defaultdict(list) 进行排序。
我将如何对值进行排序,以便对于每个键(地址),具有最高 "Check1" 的字典排在第一位?
defaultdict(list,
'Address_1': ['Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 8,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 20,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 27,
'Check2' : 1],
'Address_2': ['Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 30,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 38,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 12,
'Check2' : 1])
结果如下所示:
defaultdict(list, 'Address_1': ['Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 27,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 20,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 8,
'Check2' : 1],
'Address_2': ['Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 38,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 30,
'Check2' : 1,
'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 12,
'Check2' : 1])
【问题讨论】:
【参考方案1】:不知道是什么问题,很简单:
for key, values in dictionary.items():
values.sort(key=lambda value: value['Check1'], reverse=True)
【讨论】:
我建议在dictionary.values()
上进行迭代,因为您没有对密钥做任何事情。【参考方案2】:
您可以通过使用sorted
函数+ dict理解来获得预期的结果。
具体来说,我们可以遍历 defaultdict 字典的键值对(其中每个值都是字典列表),并通过每个列表中每个字典的 'Check1'
键对每个值(即字典列表)进行排序. sorted
默认按升序排序,但由于我们要按降序排序,所以我们添加-
符号以按正确顺序排序。
out = k: sorted(lst, key=lambda x: -x.get('Check1')) for k, lst in your_defaultdict.items()
输出:
'Address_1': ['Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1': 27,
'Check2': 1,
'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1': 20,
'Check2': 1,
'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 8,
'Check2': 1],
'Address_2': ['Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1': 38,
'Check2': 1,
'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 30,
'Check2': 1,
'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1': 12,
'Check2': 1]
【讨论】:
嘿,谢谢,效果很好。你介意解释一下它是如何工作的吗? @aero8991 我加了一点解释。如果您仍有疑问,请告诉我。 这个答案重建了一个包含新列表的新字典,这对于操作来说似乎有点矫枉过正;按照@Marat 的回答中的建议对列表进行排序可能是一个更好的解决方案。以上是关于按最高项目号对 defaultdict(list) 进行排序的主要内容,如果未能解决你的问题,请参考以下文章
defaultdict(list) 将所有值连接到一个列表中
循环遍历 django 模板中的 defaultdict(list) 结构
我的 defaultdict(list) 不会显示在模板上,但在我看来 [重复]
我的 defaultdict(list) 不会显示在模板上,但在我看来 [重复]