【问题标题】:sort a defaultdict(list) by highest item number按最高项目号对 defaultdict(list) 进行排序
【发布时间】: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}]})

【问题讨论】:

    标签: python pandas sorting dictionary


    【解决方案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 的回答中的建议对列表进行排序可能是一个更好的解决方案。
    猜你喜欢
    • 2012-04-28
    • 2020-12-23
    • 2013-04-06
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多