簡體   English   中英

按每個字典鍵對字典列表進行排序

[英]Sort a list of dicts by each dicts key

我正在創建一個字典列表,然后我想按鍵的值從最低到最高對列表中的字典進行排序。

一切正常,除了排序:

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)}]

該排序順序是不正確的,至少就我認為它應該如何排序而言是不正確的:按字典中鍵的值,從最低到最高。

使用每個字典中的鍵作為排序鍵的工作原理是將它們轉換為列表:

>>> 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)}]

這是一種方式:

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)}]

正如@Mike 所說,訣竅是將執行dict.keys()或 dict.values list()的結果轉換為list() dict.values() 否則,您將收到以下錯誤之一:

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

我在這里添加一個簡潔的副本/面食演示來幫助谷歌流量。

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}
#   ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM