簡體   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