1

2 レベルのネストされたデフォルトの辞書を再帰的にソートしようとしています。これを適切に行う方法を理解できませんでした。私の問題文を以下に示します。

  1. 第 1 レベルのキーは、自然な並べ替えでなければなりません。
  2. 第 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)])]
4

2 に答える 2

0

残念ながら、どの解決策もうまくいきませんでした。これは私が思いついた醜いソートです。

def TradeGroupSort(trade_group):
  """Sorting the trade group."""
  group, _ = trade_group  # The value is a tuple ('XYZ', 50) for e.g.
  return trade_groups.index(group)

それよりも良い解決策は思いつきませんでした。この関数を次のように呼び出しました。

SortTotals(trade_group_totals, operator.itemgetter(0), TradeGroupSort)

これにより、期待される結果が返されます。

于 2012-11-05T02:45:23.827 に答える
0

少し難解に見えるかもしれませんが、実際には非常に単純です。最初に、items メソッドから主キーと値のリスト (二次辞書) を作成します。明示的な順序付けがあるので、その順序で並べ替える代わりに、その順序で内部辞書から要素を取得し、必要に応じて定義に従って並べ替えることができます。

次に、プリンシパル キーを好みの方法で並べ替えることができます (この場合は単純な順序付けのみ)。

items = [ (k,sorted(v.items(),key=itemgetter(1),reverse=True)) 
                              for k,v in trade_group_totals.items()]
items_sortes = sorted(items,reverse=True)

特定の問題における自然な順序付けの意味に応じて、最初の並べ替えを気にせずに2番目の並べ替えを変更できます

于 2012-10-29T23:20:35.237 に答える