キーに基づいて dict をソートし、クラスのオーバーライドされた iter メソッド内からイテレータを値に返そうとしています。新しいリストを作成し、キーを並べ替えるときにリストに挿入するよりも、これを行うためのより適切で効率的な方法はありますか?
4 に答える
このようなものはどうですか:
def itersorted(d):
for key in sorted(d):
yield d[key]
def sortedDict(dictobj):
return (value for key, value in sorted(dictobj.iteritems()))
これにより、単一の中間リストが作成され、「sorted()」メソッドは実際のリストを返します。しかし、少なくともそれは 1 つだけです。
断然最も簡単で、ほぼ確実に最速のアプローチは、次のようなものです。
def sorted_dict(d):
keys = d.keys()
keys.sort()
for key in keys:
yield d[key]
すべてのキーをフェッチしないとソートできません。すべてのキーを取得してリストに入れ、そのリストをソートするのが最も効率的な方法です。リストの並べ替えは非常に高速であり、そのようなキー リストのフェッチは可能な限り高速です。次に、値の新しいリストを作成するか、例のように値を生成できます。辞書を反復している場合は辞書を変更できないことに注意してください (次の反復は失敗します)。したがって、sorted_dict() の結果を処理する前に辞書を変更する場合は、リストを返すようにします。 .
デフォルトのソート順が必要な場合は、sorted(list)
またはを使用できますlist.sort()
。独自の並べ替えロジックが必要な場合、Python リストは、渡された関数に基づいて並べ替える機能をサポートしています。たとえば、関数を使用して数値を最小から最大 (既定の動作) に並べ替える方法は次のとおりです。
def compareTwo(a, b):
if a > b:
return 1
if a == b:
return 0
if a < b:
return -1
List.Sort(compareTwo)
print a
このアプローチは、新しいリストを手動で作成して新しい値を追加するよりも概念的に少し簡潔であり、並べ替えロジックを制御できます。