我有一個要排序的字典串列。這是我到目前為止所擁有的:
output_list = [{'interface': '0/20', 'mac': '01:23:45:67:89:AB'},
{'interface': '0/16', 'mac': '12:34:56:78:9A:BC'},
{'interface': '0/31', 'mac': '23:45:67:89:AB:CD'},
{'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'},
{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'}]
mac_list = sorted(output_list, key=lambda d: d['interface'])
pprint(mac_list)
但是,它并沒有按照我想要的方式對字典進行排序。
"C:\Program Files\Python310\python.exe" "C:/Scripts/Python/test1.py"
[{'interface': '0/16', 'mac': '12:34:56:78:9A:BC'},
{'interface': '0/20', 'mac': '01:23:45:67:89:AB'},
{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'},
{'interface': '0/31', 'mac': '23:45:67:89:AB:CD'},
{'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'}]
Process finished with exit code 0
我怎樣才能讓它排序它看起來像這樣:
[{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'},
{'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'},
{'interface': '0/16', 'mac': '12:34:56:78:9A:BC'},
{'interface': '0/20', 'mac': '01:23:45:67:89:AB'},
{'interface': '0/31', 'mac': '23:45:67:89:AB:CD'}]
uj5u.com熱心網友回復:
您需要從字串中取出數字:
sorted(output_list, key=lambda d: int(d['interface'].split("/")[1]))
這假設界面的第一部分不會改變。
如果它發生變化,您需要使用前導零重新格式化這兩個部分:
sorted(output_list, key=lambda d: "/".join([f"{int(x):02d}" for x in d['interface'].split("/")]))
uj5u.com熱心網友回復:
嘗試這個:
mac_list = sorted(output_list, key=lambda d: int(d['interface'].split("/")[1]))
如果interface值可以以 以外的其他值開頭0,并且您希望它成為排序值的一部分,那么您可以使用以下內容:
mac_list = sorted(output_list, key=lambda d: int(d['interface'].split("/")[0]) * 10000 int(d['interface'].split("/")[1]))
uj5u.com熱心網友回復:
我不確定第一個介面數是否可以大于零,但如果不是,此更改會有所幫助。您只想檢查 / 之后的數字:
mac_list = sorted(output_list, key=lambda d: int(d["interface"][2:]))
輸出是:
[{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'}, {'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'}, {'interface': '0/16', 'mac': '12:34:56:78:9A:BC'}, {'interface': '0/20', 'mac': '01:23:45:67:89:AB'}, {'interface': '0/31', 'mac': '23:45:67:89:AB:CD'}]
uj5u.com熱心網友回復:
如果你總是有0/???. 嘗試這個:
mac_list = sorted(output_list, key= lambda x: int(x['interface'][2:]))
輸出:
[{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'},
{'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'},
{'interface': '0/16', 'mac': '12:34:56:78:9A:BC'},
{'interface': '0/20', 'mac': '01:23:45:67:89:AB'},
{'interface': '0/31', 'mac': '23:45:67:89:AB:CD'}]
如果可能有???/???。試試這個:(轉換怎么樣1/3 to 1.3?)
# 1/3 -> 1.3 then get as float and sort
sorted(output_list, key= lambda x: float(x['interface'].replace('/', '.')))
# or as string
sorted(output_list, key= lambda x: (int(x['interface'][:1]),int(x['interface'][2:])))
輸出:
[{'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'},
{'interface': '0/16', 'mac': '12:34:56:78:9A:BC'},
{'interface': '0/20', 'mac': '01:23:45:67:89:AB'},
{'interface': '0/31', 'mac': '23:45:67:89:AB:CD'},
{'interface': '1/3', 'mac': '45:67:89:AB:CD:EF'}]
uj5u.com熱心網友回復:
用于natsort自然排序:
from natsort import natsorted
mac_list = natsorted(output_list, key=lambda d: d['interface'])
或拆分并轉換為整數:
mac_list = sorted(output_list,
key=lambda d: tuple(map(int, d['interface'].split('/'))))
輸出:
[{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'},
{'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'},
{'interface': '0/16', 'mac': '12:34:56:78:9A:BC'},
{'interface': '0/20', 'mac': '01:23:45:67:89:AB'},
{'interface': '0/31', 'mac': '23:45:67:89:AB:CD'}]
uj5u.com熱心網友回復:
與其將看似繁瑣的 lambda 運算式作為關鍵引數,不如使用一個單獨的函式來處理元組構造:-
output_list = [{'interface': '0/20', 'mac': '01:23:45:67:89:AB'},
{'interface': '0/16', 'mac': '12:34:56:78:9A:BC'},
{'interface': '0/31', 'mac': '23:45:67:89:AB:CD'},
{'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'},
{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'}]
def mt(s):
return tuple(map(int, s['interface'].split('/')))
mac_list = sorted(output_list, key=mt)
print(mac_list)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495566.html
上一篇:遍歷字典以檢查重復項
下一篇:字典中的熊貓資料框本身在字典中
