我有一本字典,它的鍵值有點像這樣,
CC-1A
CC-1B
CC-1C
CC-3A
CC-3B
CC-5A
CC-7A
CC-7B
CC-7D
SS-1A
SS-1B
SS-1C
SS-3A
SS-3B
SS-5A
SS-5B
lst = ['CC-1A', 'CC-1B', 'CC-1C', 'CC-3A', 'CC-3B', 'CC-5A', 'CC-7A', 'CC-7B',
'CC-7D', 'SS-1A', 'SS-1B', 'SS-1C', 'SS-3A', 'SS-3B', 'SS-5A', 'SS-5B']
d = dict.fromkeys(lst)
^不完全是這個順序,但實際上它們都是隨機放置在字典中作為鍵值的。
現在,我想對它們進行排序。如果我使用內置函式對字典進行排序,它會根據上面給出的順序對所有鍵值進行排序。
但是,我希望首先根據- 符號后的值(即 1A、1B、1C 等)對字典進行排序,然后根據前兩個字符對字典進行排序。
因此,對于上面給出的值,以下是我的排序串列,
CC-1A
CC-1B
CC-1C
SS-1A
SS-1B
SS-1C
CC-3A
CC-3B
SS-3A
SS-3B
CC-5A
and so on
首先,根據鍵中的“第 4 個”字符進行排序。(即1、3等)
然后根據最后一個字符(即 A、B 等)進行排序
然后根據鍵的前兩個字符(即 CC、SS 等)進行排序。
有什么辦法可以做到這一點?
uj5u.com熱心網友回復:
您可以使用將您的規則實作為排序鍵的自定義函式:
def get_order(tpl):
s = tpl[0].split('-')
return (s[1][0], s[0], s[1][1])
out = dict(sorted(d.items(), key=get_order))
輸出:
{'CC-1A': None, 'CC-1B': None, 'CC-1C': None, 'SS-1A': None, 'SS-1B': None, 'SS-1C': None, 'CC-3A': None, 'CC-3B': None, 'SS-3A': None, 'SS-3B': None, 'CC-5A': None, 'SS-5A': None, 'SS-5B': None, 'CC-7A': None, 'CC-7B': None, 'CC-7D': None}
uj5u.com熱心網友回復:
你的“想要”和你的排序描述有偏差。
你的“想要”可以通過
di = {"CC-1A":"value1","CC-1A":"value2","CC-1B":"value3",
"CC-1C":"value4","CC-3A":"value5","CC-3B":"value6",
"CC-5A":"value7","CC-7A":"value8","CC-7B":"value9",
"CC-7D":"value0","SS-1A":"value11","SS-1B":"value12",
"SS-1C":"value13","SS-3A":"value14","SS-3B":"value15",
"SS-5A":"value16","SS-5B":"value17"}
print(*((v,di[v]) for v in sorted(di, key= lambda x: (x[3], x[:2], x[4]) )),
sep="\n")
要得到
('CC-1A', 'value2')
('CC-1B', 'value3')
('CC-1C', 'value4')
('SS-1A', 'value11')
('SS-1B', 'value12')
('SS-1C', 'value13')
('CC-3A', 'value5')
('CC-3B', 'value6')
('SS-3A', 'value14')
('SS-3B', 'value15')
('CC-5A', 'value7')
('SS-5A', 'value16')
('SS-5B', 'value17')
('CC-7A', 'value8')
('CC-7B', 'value9')
('CC-7D', 'value0')
按數字排序(Pos 4 -(1based)),Start(Pos 1 2(1based))然后是字母(Pos 5(1based))
但這與
首先,根據鍵中的“第 4 個”字符進行排序。(即1、3等)
然后根據最后一個字符(即 A、B 等)進行排序
然后根據鍵的前兩個字符(即 CC、SS 等)進行排序。
uj5u.com熱心網友回復:
一個建議是使用嵌套字典,而不是:
my_dict = {'CC-1A1': 2,
'CC-1A2': 3,
'CC-1B': 1,
'CC-1C': 5,
'SS-1A': 33,
'SS-1B': 23,
'SS-1C': 31,
'CC-3A': 55,
'CC-3B': 222,
}
你會有類似的東西:
my_dict = {'CC': {'1A1': 2, '1A2': 3, '1B': 1, '1C': 5, '3A': 55, '3B': 222},
'SS': {'1A': 33, '1B': 22, '1C': 31}
}
這將允許您首先根據前導數字/字符進行排序,然后再按組進行排序。(實際上我認為您希望根據您的問題顛倒這個概念)。
然后,您可以通過執行以下操作使用排序的鍵/值創建兩個串列:
top_keys = sorted(my_dict)
keys_sorted = []
values_sorted = []
for key in top_keys:
keys_sorted.append([f"{key}-{k}" for k in my_dict[key].keys()])
values_sorted.append([v for v in my_dict[key].values()])
flat_keys = [key for sublist in keys_sorted for key in sublist]
flat_values = [value for sublist in values_sorted for value in sublist]
否則,您必須首先基于 之后的字符-,然后基于初始字符來實作自定義排序演算法。
uj5u.com熱心網友回復:
您可以撰寫一個函式來構建一個排序鍵,該鍵將對鍵字串進行所需的分解并回傳一個元組以進行排序。然后將該函式用作排序函式的 key= 引數:
D = {'CC-1A': 0, 'CC-1B': 1, 'CC-1C': 2, 'CC-3A': 3, 'CC-3B': 4,
'CC-5A': 5, 'CC-7A': 6, 'CC-7B': 7, 'CC-7D': 8, 'SS-1A': 9,
'SS-1B': 10, 'SS-1C': 11, 'SS-3A': 12, 'SS-3B': 13, 'SS-5A': 14,
'SS-5B': 15}
def sortKey(s):
L,R = s.split("-",1)
return (R[:-1],L)
D={k:D[k] for k in sorted(D.keys(),key=sortKey)}
print(D)
{'CC-1A': 0,
'CC-1B': 1,
'CC-1C': 2,
'SS-1A': 9,
'SS-1B': 10,
'SS-1C': 11,
'CC-3A': 3,
'CC-3B': 4,
'SS-3A': 12,
'SS-3B': 13,
'CC-5A': 5,
'SS-5A': 14,
'SS-5B': 15,
'CC-7A': 6,
'CC-7B': 7,
'CC-7D': 8}
如果您希望數字最終超過 9 并且想要一個數字順序,那么右對齊R元組中的部分:例如return (R[:-1].rjust(10),L)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404866.html
標籤:
