代码之家  ›  专栏  ›  技术社区  ›  mars

将值作为元组对字典进行排序

  •  -2
  • mars  · 技术社区  · 2 年前

        capacity= {
        'one': (57000, 3100, 0.12903225806451613),
     'two': (52911, 2400, 0.125),
     'three': (48200, 2400, 0.125),
     'four': (48200, 2480, 0.125),
     'five': (11464, 1200, 0.20833333333333334),
     'six': (44000, 1172, 0.21331058020477817),
     'seven': (42000, 1172, 0.21331058020477817)}
    

    在按元组的第三个元素排序后,我得到了以下结果。

    sorted_capacity={k: (v1,v2,v3) for k, (v1,v2,v3) in sorted(capacity.items(), key=lambda x: x[1][2],reverse=True)}
    
    
    
    sorted_capacity
    
    {'six': (44000, 1172, 0.21331058020477817),
     'seven': (42000, 1172, 0.21331058020477817),
     'five': (11464, 1200, 0.20833333333333334),
     'one': (57000, 3100, 0.12903225806451613),
     'two': (52911, 2400, 0.125),
     'three': (48200, 2400, 0.125),
     'four': (48200, 2480, 0.125)}
    

    'four': (48200, 2480, 0.125)} 之前 'two': (52911, 2400, 0.125), because 2480 is higher than 2400 .基本上,我的输出应该是这样的:

    sorted_capacity
    
        {'six': (44000, 1172, 0.21331058020477817),
         'seven': (42000, 1172, 0.21331058020477817),
         'five': (11464, 1200, 0.20833333333333334),
         'one': (57000, 3100, 0.12903225806451613),
         'four': (48200, 2480, 0.125),
         'two': (52911, 2400, 0.125),
         'three': (48200, 2400, 0.125)
         }
    

    有人能帮我想出如何实现这一点吗?

    3 回复  |  直到 2 年前
        1
  •  2
  •   Mechanic Pig    2 年前

    在键函数中,可以反转元组进行比较:

    >>> dict(sorted(capacity.items(), key=lambda item: item[1][::-1], reverse=True))
    {'six': (44000, 1172, 0.21331058020477817),
     'seven': (42000, 1172, 0.21331058020477817),
     'five': (11464, 1200, 0.20833333333333334),
     'one': (57000, 3100, 0.12903225806451613),
     'four': (48200, 2480, 0.125),
     'two': (52911, 2400, 0.125),
     'three': (48200, 2400, 0.125)}
    
        2
  •  2
  •   Grismar    2 年前

    您的代码已修复问题:

    from pprint import pprint
    
    capacity = {
        'one': (57000, 3100, 0.12903225806451613),
        'two': (52911, 2400, 0.125),
        'three': (48200, 2400, 0.125),
        'four': (48200, 2480, 0.125),
        'five': (11464, 1200, 0.20833333333333334),
        'six': (44000, 1172, 0.21331058020477817),
        'seven': (42000, 1172, 0.21331058020477817)}
    
    sorted_capacity = {
        k: (v1, v2, v3)
        for k, (v1, v2, v3) in sorted(capacity.items(), key=lambda x: (x[1][2], x[1][1]), reverse=True)
    }
    
    pprint(sorted_capacity, sort_dicts=False)  # don't want pprint to sort again
    

    key 。如果希望在第二列相同时使用第一列,也可以反转元组:

    key=lambda x: tuple(reversed(x[1]))
    

    或:

    key=lambda x: x[1][::-1]
    
        3
  •  1
  •   Barmar    2 年前

    使用

    key = lambda x: (x[1][-1], x[1][1])