1

Pythonで次のことを実現できるかどうか疑問に思います。

ネストされたディクショナリnested_dictがあり、各3要素タプル(a, b, c)をサブディクショナリにマップします。また、上記のタプルキーの2番目の要素(つまり、で示される要素)に対応するすべての要素を含むsub_dict別のリストがあります。list_bb

nested_dictと、およびとのlist_b固定ペア(つまり、それぞれタプルキーの1番目と3番目の要素)が与えられた場合、その一部を形成する要素に基づいて、サブディクショナリに対してソートされたイテレータを取得したい思いますタプルキー、つまり、このイテレータを使用することで、次のように返されたサブディクショナリを反復処理できます。aclist_b

nested_dict[(a, b_1, c)], nested_dict[(a, b_2, c)], nested_dict[(a, b_3, c)], ...

ここでb_1 < b_2 < b_3 ...、それぞれb_ilist_b

私はこの線に沿って考えています:

def sorted_dict_itr (nested_dict, list_b, a, c):
    return (nested_dict[(a, b, c)] for b in sorted(list_b))

しかし、これは常にイテレータをnested_dict[(a, b, c)]次の順序で返しますbか?もしそうなら、同じことを達成するためのより効率的な方法(より高速なコードを意味する)はありますか?

4

2 に答える 2

1

はい、デフォルトで課さbれる要素の順序が必要な場合は、そうする必要があります。sorted()

于 2012-06-05T18:49:52.980 に答える
1

はい、動作します。

list_bを保持する代わりにソートされたコレクションを保持し、その場でソートすると効率が向上しますが、もちろん、他の場所でより重要な効率が低下する可能性があります。

アルゴリズムの複雑さを改善する他の方法はありません。dictルックアップは定数時間であり、リストの反復は、可能な限り反復するのと同じくらい高速です。

各(a、b、c)タプルをさまざまな方法でハッシュする必要がないようにすることで、小さな定数係数で処理を高速化できる可能性がありますが、それによって大きな違いが生じるとは思えません。

変数スコープに関連するさまざまなマイクロ最適化と、値を生成するかジェネレーターを返すかどうかによって、いくつかのオペコードで処理を高速化できますが、それが問題になるとは想像しがたいです。

于 2012-06-05T21:53:17.547 に答える