次のような辞書のリストがあります。
users = [{'id':1, 'name': 'shreyans'}, {'id':2, 'name':'alex'}, {'id':3, 'name':'david'}]
および希望する順序の ID のリスト:
order = [3,1,2]
users
リストをリストごとに並べる最良の方法は何order
ですか?
users = [{'id':1, 'name': 'shreyans'},
{'id':2, 'name':'alex'},
{'id':3, 'name':'david'}]
order = [3,1,2]
users.sort(key=lambda x: order.index(x['id']))
リストが非常に大きい場合:
userd = {d['id']:d for d in users}
sortedusers = [userd.get(o) for o in order]
これはO(2n)
。sort
のみを使用するソリューションO(n^3.log(n))
は (sort is nlogn
、list 内のすべての id の位置を見つける is O(n^2)
) になります。これは、大きなリストの場合は明らかに悪化します。小さいリスト (3 項目など) の場合、新しいデータ構造を作成しないことによるオーバーヘッドが少ないため、処理が速くなります。逆に、新しい仕様で並べ替えを続けるorder
と、新しい dict を作成するオーバーヘッドはすぐに償却されます。
カスタム キーで並べ替えを使用します。
users.sort(key=lambda x: order.index(x['id']))