【问题标题】:Sort a list of dicts by each dicts key按每个 dicts 键对 dicts 列表进行排序
【发布时间】:2018-07-12 03:17:36
【问题描述】:

我正在创建一个字典列表,然后我想按键的值对列表中的字典进行排序,从最低到最高。

除了排序之外,一切正常:

def pythagorean(x1, y1, x2=0, y2=0):
    return ((x1 - x2)**2 + (y1 - y2)**2)**0.5


points = [(-2, -4), (0, -2), (-1, 0), (3, -5), (-2, -3), (3, 2)]

dicts = []

for coord in points:
    d = {}
    a1, b1 = coord
    distance = pythagorean(a1, b1)
    d[distance] = (a1, b1)
    dicts.append(d)

for i in dicts:
    print(i)

dist_list = []

for item in dicts:
    for key in item:
        dist_list.append(key)


temp = sorted(dicts, key=lambda d: [k in d for k in dist_list])
print(temp)

我得到以下输出:

{4.47213595499958: (-2, -4)}
{2.0: (0, -2)}
{1.0: (-1, 0)}
{5.830951894845301: (3, -5)}
{3.605551275463989: (-2, -3)}
{3.605551275463989: (3, 2)}
[4.47213595499958, 2.0, 1.0, 5.830951894845301, 3.605551275463989, 3.605551275463989]
[{3.605551275463989: (-2, -3)},
 {3.605551275463989: (3, 2)},
 {5.830951894845301: (3, -5)},
 {1.0: (-1, 0)}, 
 {2.0: (0, -2)},
 {4.47213595499958: (-2, -4)}]

该排序顺序是不正确的,至少就我认为应该如何排序而言:按字典中键的值,从最低到最高。

【问题讨论】:

    标签: python python-3.x list sorting dictionary


    【解决方案1】:

    正如@Mike 所说,诀窍是将执行dict.keys()dict.values() 的结果转换为list()。否则,您将收到以下错误之一:

    • TypeError: 'dict_keys' object is not subscriptable
    • TypeError: 'dict_values' object is not subscriptable

    我在这里添加一个简洁的复制/意大利面演示来帮助 Google 流量。

    import logging
    
    # sort by keys
    sorted(
      [
        { level: getattr(logging, level) }
        for level in
        ['WARNING', 'WARN', 'NOTSET', 'INFO', 'FATAL', 'ERROR', 'DEBUG', 'CRITICAL']
      ],
      key=lambda o:list(o.keys())[0]
    )
    
    # returns:
    #   [
    #     {'CRITICAL': 50}, {'DEBUG': 10}, {'ERROR': 40}, {'FATAL': 50}, 
    #     {'INFO': 20}, {'NOTSET': 0}, {'WARN': 30}, {'WARNING': 30}
    #   ]
    
    
    # sort by values
    sorted(
      [
        { level: getattr(logging, level) }
        for level in
        ['WARNING', 'WARN', 'NOTSET', 'INFO', 'FATAL', 'ERROR', 'DEBUG', 'CRITICAL']
      ],
      key=lambda o:list(o.values())[0]
    )
    
    # returns:
    #   [
    #     {'NOTSET': 0}, {'DEBUG': 10}, {'INFO': 20}, {'WARNING': 30}, 
    #     {'WARN': 30}, {'ERROR': 40}, {'FATAL': 50}, {'CRITICAL': 50}
    #   ]
    

    【讨论】:

      【解决方案2】:

      使用每个字典中的键作为排序键,通过将它们转换为列表来工作:

      >>> sorted(dicts, key=lambda d: list(d.keys()))
      [{1.0: (-1, 0)},
       {2.0: (0, -2)},
       {3.605551275463989: (-2, -3)},
       {3.605551275463989: (3, 2)},
       {4.47213595499958: (-2, -4)},
       {5.830951894845301: (3, -5)}]
      

      【讨论】:

      • [0]的用途是什么?
      • 哦,键:值对。键 = [0],值 = [1]
      • 为您提供第一个(也是唯一一个)密钥。
      • 实际上,它可以在没有[0] 的情况下使用并使用整个列表。如果您有多个键,这也可以。
      【解决方案3】:

      这是一种方式:

      lst = [{3.605551275463989: (-2, -3)}, {3.605551275463989: (3, 2)},
             {5.830951894845301: (3, -5)}, {1.0: (-1, 0)}, 
             {2.0: (0, -2)}, {4.47213595499958: (-2, -4)}]
      
      list(map(dict, sorted(list(i.items()) for i in lst)))
      
      # [{1.0: (-1, 0)},
      #  {2.0: (0, -2)},
      #  {3.605551275463989: (-2, -3)},
      #  {3.605551275463989: (3, 2)},
      #  {4.47213595499958: (-2, -4)},
      #  {5.830951894845301: (3, -5)}]
      

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2013-03-05
        • 2018-07-10
        • 2018-04-30
        相关资源
        最近更新 更多