大丈夫。これは難しいかもしれませんが、私はかなり改善せずにかなり苦労しているので、皆さんの考えを知りたいです.
次のオブジェクトのリストがあるとします。
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},
]
このリストを「id」(例: ) で並べ替えたいのです'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'} ] ]
ご覧のとおり、ネストされた各リストは、他の要素の子である要素で構成されています。たとえば、2 番目のネストされたリスト[ {'w': 0.8, 'id': '1.1'}, {'w': 0.3, 'id': '1.3'}, {'w': 0.2, 'id': '1.2'} ]
には、 element のすべての子が含まれます[ {'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}
は子がないため、何もする必要はありません)。それ)。
私はいくつかのことを試しました(複雑すぎて説明に値しません)。かなりの数の条件と醜いコードになってしまいました。
この並べ替えを行うにはどうすればよいですか。
前もって感謝します。