按最高项目号对 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) 不会显示在模板上,但在我看来 [重复]

将带有字典列表的 defaultdict(list) 字典转换为 csv 的最佳方法

defaultdict