2 レベルのネストされたデフォルトの辞書を再帰的にソートしようとしています。これを適切に行う方法を理解できませんでした。私の問題文を以下に示します。
- 第 1 レベルのキーは、自然な並べ替えでなければなりません。
第 2 レベルのキーは、特定の順序で並べ替える必要があります。インデックスが要素の順序を表すリストを作成しようとしました。私のコードスニペットを以下に示します。
import operator import collections trade_group_totals = collections.defaultdict(lambda:collections.defaultdict(float)) trade_group_totals['foo']['ABC'] = 100 trade_group_totals['foo']['XYZ'] = 50 trade_group_totals['bar']['ABC'] = 150 trade_group_totals['bar']['XYZ'] = 250
私のソートインデックスの比較:
trade_groups = ['XYZ', 'ABC']
def TradeGroupSort(trade_group):
return trade_groups.index(trade_group)
def SortTotals(totals, sort_function_one, sort_function_two):
return [
(k1, v1) for k1, v1 in [(k, sorted(v.iteritems(), key=sort_function_two))
for k, v in sorted(totals.iteritems(), key=sort_function_one)]]
次のように関数を呼び出しています。
SortTotals(
trade_group_totals, operator.itemgetter(0),
sort_function_two=lambda x: operator.methodcaller('TradeGroupSort', x))
私の予想される出力は次のようになります。
[('bar', [('XYZ', 50), ('ABC', 100)]), ('foo', [('XYZ', 250), ('ABC', 150)])]
しかし、生成された出力は
[('bar', [('XYZ', 50), ('ABC', 150)]), ('foo', [('ABC', 150), ('XYZ', 250)])]