好的。這可能很困難,但我一直在努力掙扎,但沒有得到很大的改善,所以我想知道你們的想法。某些情況下的「困難」排序
假設我有以下對象名單:
objects = [
{'id': '1', 'w': 0.20},
{'id': '1.1', 'w': 0.80},
{'id': '1.2', 'w': 0.20},
{'id': '1.3', 'w': 0.30},
{'id': '1.1.1', 'w': 0.60},
{'id': '1.1.2', 'w': 0.70},
{'id': '1.1.3', 'w': 0.40},
{'id': '1.2.1', 'w': 0.30},
]
我想通過「身份證」(例如'1', '1.1', '1.1.1', '1.1.2', '1.1.3', '1.2', '1.2.1', '1.3'
)排序這個名單,但隨後都具有相同的父元素需要通過「W訂購' (相反)。 '同父'是什麼意思?那麼,'1'是'1.1','1.2'和'1.3'的父項。同樣,「1.1」是「1.1.1」,「1.1.2」,「1.1.3」的父代,「1.2」是「1.2.1」的父代。爲了更好地說明這一點,可以想象這是一個嵌套註釋的線程表示('1'是原始帖子,'1.1'是它的答案,等等)。
現在,我已經能夠達到以下形式:
[ [ {'w': 0.2, 'id': '1'} ], [ {'w': 0.8, 'id': '1.1'}, {'w': 0.3, 'id': '1.3'},
{'w': 0.2, 'id': '1.2'} ], [ {'w': 0.7, 'id': '1.1.2'}, {'w': 0.6, 'id': '1.1.1'},
{'w': 0.4, 'id': '1.1.3'} ], [ {'w': 0.3, 'id': '1.2.1'} ] ]
正如你所看到的,每個嵌套列表包括其他元素的子元素。例如,第二個嵌套列表[ {'w': 0.8, 'id': '1.1'}, {'w': 0.3, 'id': '1.3'}, {'w': 0.2, 'id': '1.2'} ]
包含元素[ {'w': 0.2, 'id': '1'} ]
的所有子元素。此外,每個嵌套列表都按'w'排序。
最終的結果應該是這樣的(假設鏈接所有內部列表 - list(itertools.chain(*b))
):
{'id': '1', 'w': 0.20}, {'id': '1.1', 'w': 0.80}, {'id': '1.1.2', 'w': 0.70},
{'id': '1.1.1', 'w': 0.60}, {'id': '1.1.3', 'w': 0.40}, {'id': '1.3', 'w': 0.30},
{'id': '1.2', 'w': 0.20}, {'id': '1.2.1', 'w': 0.30}
基本上,第一次去的家長,那麼它的孩子,和(由「W」命令)同樣適用於每個元素(如果它有孩子,當然 - 這裏{'id': '1.3', 'w': 0.30}
沒有孩子,所以我們不需要對它做任何事情)。
我已經嘗試了一些事情(太複雜,值得解釋)。我結束了很多條件和一個醜陋的代碼。
我該如何完成這個排序?
在此先感謝。
你張貼了預期的效果樣品沒有排序按你的描述。例如,「1.1.2」在「1.1.1」之前; 'w'是任意排序的。 –
@BurhanKhalid w按照相反順序排列,如果仔細觀察,結果確實有意義。 – jamylak
@BurhanKhalid是的,正如jamylak所說,1.1.2之前是因爲它是1.1的孩子,所以按照我的描述,它們應該用'w'(前0.70,然後0.60)排序。對不起,我錯過了這個澄清。 –