[英]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.