繁体   English   中英

在 python 中按键对嵌套的字典列表进行排序

[英]sort a nested list of dicts by key in python

下面是一个示例嵌套的字典列表。 我想按查理拥有的点数对列表进行排序。

l = [[{'Name': 'Alice',   'Age': 40, 'Point': 80},
      {'Name': 'Bob',     'Age': 20             },
      {'Name': 'Charlie', 'Age': 30, 'Point': 10}],
     [{'Name': 'Alice',   'Age': 40, 'Point': 80},
      {'Name': 'Bob',     'Age': 20             },
      {'Name': 'Charlie', 'Age': 30, 'Point': 30}],
     [{'Name': 'Alice',   'Age': 40, 'Point': 80},
      {'Name': 'Bob',     'Age': 20             },
      {'Name': 'Charlie', 'Age': 30, 'Point': 20}]]

output 应该是这样的。

l = [[{'Name': 'Alice',   'Age': 40, 'Point': 80},
      {'Name': 'Bob',     'Age': 20             },
      {'Name': 'Charlie', 'Age': 30, 'Point': 10}],
     [{'Name': 'Alice',   'Age': 40, 'Point': 80},
      {'Name': 'Bob',     'Age': 20             },
      {'Name': 'Charlie', 'Age': 30, 'Point': 20}],
     [{'Name': 'Alice',   'Age': 40, 'Point': 80},
      {'Name': 'Bob',     'Age': 20             },
      {'Name': 'Charlie', 'Age': 30, 'Point': 30}]]

我想我应该能够将 sorted() 与正确的 arguments 一起使用,但我不确定语法是什么。

sorted(l, key=lambda x: x[ ????? ])

Charlie 始终是子列表中的第三项。

使用 lambda 在嵌套列表中搜索 Charlie 的点:

l.sort(key=lambda lst: next(d.get('Point', 0) for d in lst if d.get('Name')=='Charlie'))
print(l)

如果你想要一个新列表:

out = sorted(l, key=lambda lst: next(d.get('Point', 0) for d in lst if d.get('Name')=='Charlie'))

Output:

[[{'Name': 'Alice', 'Age': 40, 'Point': 80},
  {'Name': 'Bob', 'Age': 20},
  {'Name': 'Charlie', 'Age': 30, 'Point': 10}],
 [{'Name': 'Alice', 'Age': 40, 'Point': 80},
  {'Name': 'Bob', 'Age': 20},
  {'Name': 'Charlie', 'Age': 30, 'Point': 20}],
 [{'Name': 'Alice', 'Age': 40, 'Point': 80},
  {'Name': 'Bob', 'Age': 20},
  {'Name': 'Charlie', 'Age': 30, 'Point': 30}]]

如果查理总是第三,你可以使用这个:

sorted(l, key=lambda x: x[2]['Point'])

否则,您需要使用帮助程序 function:

def get_charlie_points(lst):
    for item in lst:
        if item['Name'] == 'Charlie':
            return item['Point']
    return 0  # Replace this with the number you want if there is no Charlie, or raise an exception

sorted(l, key=get_charlie_points)

与@enke 的答案非常相似,但使用next提供默认值0 ,而不是get方法。

s = sorted(l, key=lambda lst: next((d['Point'] for d in lst if d['Name'] == 'Charlie'), 0))

如果查理总是第三,保持简单,使用:

out = sorted(l, key=lambda x:x[2].get('Point', float('inf')))

注意。 如果查理没有积分,我使用默认值无限,将其推到最后。

Output:

[[{'Name': 'Alice', 'Age': 40, 'Point': 80},
  {'Name': 'Bob', 'Age': 20},
  {'Name': 'Charlie', 'Age': 30, 'Point': 10}],
 [{'Name': 'Alice', 'Age': 40, 'Point': 80},
  {'Name': 'Bob', 'Age': 20},
  {'Name': 'Charlie', 'Age': 30, 'Point': 20}],
 [{'Name': 'Alice', 'Age': 40, 'Point': 80},
  {'Name': 'Bob', 'Age': 20},
  {'Name': 'Charlie', 'Age': 30, 'Point': 30}]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM