2016-06-15 15 views
0

入れ子にされたdefaultdictsで構成されたこのリストをどのように並べるかについて頭を悩ませている。私はこれを使って '登録'キーと 'クラス'の値で並べ替えることができました。辞書のリスト内に入れ子になったdefaultdictを並べ替え

sorted(dict1.items(), key=itemgetter(1), reverse=True) 

[('registration', {'count': 11, 'classes': Counter({'class1': 5, 'class2': 5, 'class3': 1}), 'date': defaultdict(<function date_record at 0x7fc173646500>, {datetime.date(2016, 6, 7): {'count': 1, 'hour': Counter({16: 1})}, datetime.date(2016, 6, 6): {'count': 10, 'hour': Counter({16: 5, 14: 2, 8: 1, 10: 1, 12: 1})}})})]

しかし、今私は、ネストされたdefaultdictある「日付」でソートしようとしています。私は日付順に(から - )、そして最後に '時間'カウンター(時系列的に)を注文しようとしています(参考のために8 = 8am、16 = 4pm)。

したがって、上記のdefaultdictは次のようになります。

[('registration', {'count': 11, 'classes': Counter({'class1': 5, 'class2': 5, 'class3': 1}), 'date': defaultdict(<function date_record at 0x7fc173646500>, {datetime.date(2016, 6, 6): {'count': 10, 'hour': Counter({16: 5, 14: 2, 12: 1, 10: 1, 8: 1})}, datetime.date(2016, 6, 7): {'count': 1, 'hour': Counter({16: 1, 14: 4})}})})]

私はちょうどdefaultdictにアクセスする方法を考え出すのトラブルを抱えています。並べ替えの中で私がどのようにアクセスできるかについてのガイダンスはありますか?

答えて

0

並べ替えまたは並べ替えのパラメータは、任意の呼び出し可能にすることができます。この呼び出し可能オブジェクトは、Pythonの==<=演算子と直接比較できるオブジェクトを返さなければなりません。 keyとして渡されたオブジェクトは、itemgetterまたはその他の複雑な構造体によって返される呼び出し可能になる必要はありません。

ラムダでも可能な短い表現関数である必要はありません。

したがって、関数を定義して、比較する属性を取得するためのサイズを持たせてください。複数の値がある場合は、それらの値を含むシーケンスを返します。このファンクションをkeyという名前のパラメータにsortに渡します。

私はあなたがアリあなたのdateネストされたディレクトリ内のあなたのキー/値を注文する方法を見つけ出すことができますが、それに沿って何かをすることができれば、私は確かではない午前:あなたは、内ソートを必要とする

def sort_key(item): 
    dates = list(item["date"].items()) 
    # the key in the lambda bellow will get 
    # tuples with the datetime and subdictionary for each date: 

    dates.sort(key=lambda inner_date: (inner_date[0], sorted(inner_date[1]["hour"].keys()) 
    return dates 

注意rderは "時間"の値を尊重したキーを持っています - 私はあなたのリスト項目のそれぞれの "日付"の種類の各キーをタプルとして返します。最初の要素は、 2番目の値は、カウンタに表示される値のソートされたリストです(ただし、各値のカウントは含まれません)。

この二次キーがラムダに収まるには複雑すぎる場合は、別の関数を作成してください。これらの関数は、ソートしている外側のリストの各項目に対して1回だけ呼び出されるため、パフォーマンスはまだOKです。

+0

ご回答いただきありがとうございます。私は上記を試して、私は問題があると思う '日付'キーをつかむ問題があると思うdate = list(item ["date"] iteritems()) TypeError:リストインデックスはstr'ではなく整数でなければならない(私は.items同じこと)。何らかの理由で、それは重要な価値を認識せず、それがリスト指標であると考えている。どのように私はキーを得ることができるかについての任意のアイデア? – user1165419

+0

私はそれをもう少し使って、この 'dates = list(item [0] [1] [items]())'を実行しましたが、想像するように、これは最初の結果のみを取得します。私はラムダ関数が[0] [1]を反復する必要があると思うが、私が見た例でそれを理解することはできなかった。 – user1165419

+0

ソートは、forループを使用してそれを分かり、そこでソートしました。ヘルプ/ガイダンスをありがとう! – user1165419

関連する問題