__iter__ で辞書を並べ替える
-
01-07-2019 - |
質問
キーに基づいて辞書を並べ替え、クラス内のオーバーライドされた iter メソッド内からの値のイテレータを返そうとしています。新しいリストを作成し、キーを並べ替えながらリストに挿入するよりも、これを行うためのより適切で効率的な方法はありますか?
解決
次のようなものはどうでしょうか。
def itersorted(d):
for key in sorted(d):
yield d[key]
他のヒント
これまでで最も簡単で、ほぼ間違いなく最速のアプローチは、次のようなものです。
def sorted_dict(d):
keys = d.keys()
keys.sort()
for key in keys:
yield d[key]
すべてのキーを取得しないとソートできません。すべてのキーをリストにフェッチし、そのリストを並べ替えるのが最も効率的な方法です。リストのソートは非常に高速であり、そのようなキーリストの取得も可能な限り高速です。その後、新しい値のリストを作成するか、例のように値を生成することができます。辞書を反復している場合は辞書を変更できないことに注意してください (次の反復は失敗します)。そのため、sorted_dict() の結果が完了する前に辞書を変更したい場合は、リストを返すようにします。 。
def sortedDict(dictobj):
return (value for key, value in sorted(dictobj.iteritems()))
これにより、単一の中間リストが作成され、「sorted()」メソッドは実際のリストを返します。しかし、少なくともそれは1つだけです。
デフォルトのソート順が必要な場合は、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
このアプローチは概念的に、新しいリストを手動で作成して新しい値を追加するよりも少しすっきりしており、並べ替えロジックを制御できます。
所属していません StackOverflow