你需要一個查找表,每(ID, level)
元組確定的值。你需要的所有可能的層次查找添加到排序關鍵字:
# Lookup for values by (id, level)
values = {}
minlevel, maxlevel = float('inf'), float('-inf')
for id_, level, value in inputlist:
values[id_, level] = value
if level < minlevel:
minlevel = level
if level > maxlevel:
maxlevel = level
def level_sort(tup):
id_, level, value = tup
sortkey = [level]
for l in range(minlevel, maxlevel + 1):
sortkey.append(values.get((id_, l)) if l >= level else None)
return sortkey
sorted(inputlist, key=level_sort)
排序函數生成值的列表進行排序,從自己的水平的值(None
填充任何下級)加上更高級別的相同ID的值。
例如,對於(B, 1, None)
和(C, 1, None)
元組,分類功能輸出:
>>> level_sort(('B', 1, None))
[1, None, 5.0, 55]
>>> level_sort(('C', 1, None))
[1, None, 5.0, 40]
其中只有最後一個值不同,並確定最終的排序順序。
爲此,您需要首先了解輸入列表中的最小和最大級別,因此需要更詳細的地圖構建循環。
演示:
>>> from pprint import pprint
>>> A, B, C = 'ABC'
>>> inputlist = [(A, 1, None),
... (B, 1, None),
... (C, 1, None),
... (A, 2, 1.1),
... (B, 2, 5.0),
... (C, 2, 5.0),
... (C, 3, 40),
... (B, 3, 55)]
>>> values = {}
>>> minlevel, maxlevel = float('inf'), float('-inf')
>>> for id_, level, value in inputlist:
... values[id_, level] = value
... if level < minlevel:
... minlevel = level
... if level > maxlevel:
... maxlevel = level
...
>>> def level_sort(tup):
... id_, level, value = tup
... sortkey = [level]
... for l in range(minlevel, maxlevel + 1):
... sortkey.append(values.get((id_, l)) if l >= level else None)
... return sortkey
...
>>> pprint(sorted(inputlist, key=level_sort))
[('A', 1, None),
('C', 1, None),
('B', 1, None),
('A', 2, 1.1),
('C', 2, 5.0),
('B', 2, 5.0),
('C', 3, 40),
('B', 3, 55)]
寫some_list.sort(your_method)您的自定義比較法 –
我已經更新了我的問題。 A位於頂端,因爲在2級A ['level'] and3p
已更新我的問題 – and3p