2017-06-14 11 views
1

私はちょうどうまく動作する小さなプログラムを持っています。私は自分のコードを(自分自身で)少しだけ良くしようとするために自分のコードを再検討するように強制しようとしています。forループを辞書の理解に変換する

temp2 = {} 
for key in sorted(temp1.keys()): 
    temp2[key] = temp1[key] 

辞書理解のように書き換えることができませんでした。コードのこの小さな部分があれば

私は思っていました。

主に私の経験の深い欠如のために私は これを理解することができません。

すべてのループは辞書temp1を取り、ソートして新しくソートされたkey:valueのペアをtemp2に配置します。

私が上で述べたように、すべてがそのまま動作しますが、私は改良を行うことができる パターンを見つけることを試みています。直接辞書理解にこれを翻訳

答えて

2

は簡単です:場合

temp2 = {key: value for key, value in sorted(temp1.items())} 

あなたは「キーが等しい場合は、また、そうあなたをkeyを提供することができタイブレーカーとしてvalueを使用したくありませんのみkeyに基づいてソートRE:

は辞書のpython-3.6で、あなたがそれに頼る必要があるという意味ではありません「注文」されているにもかかわらず(orderednessが正式にちょうど副作用であります!)。より良い OrderedDictを使用し、安全のために:

from collections import OrderedDict 
temp2 = OrderedDict([(key, value) for key, value in sorted(temp1.items(), key=lambda x: x[0])]) 
+0

2番目の答えは、私は(OrderedDictを含む)第三の選択肢がテーブルにもたらすかと思ったので、完全に働きました。オプション#3はいつより適切な選択肢になりますか?ありがとう。 – MarkS

+0

@マークスああ、ちょっと複雑です。辞書自体は**順不同**なので、辞書をソートするのは定義上失敗することになります。しかし、3.6ディクショナリからはじまり**の**になりました**しかし、公式にはそれはちょっと変わる可能性のある "実装の詳細"です。ですから、異なるPythonバージョンで動作させたい、あるいは "安全に遊びたい"場合は、絶対に 'OrderedDict'を使う必要があります。 OrderedDictを注文する必要がある場合は、 'dict'より優先させるのがベストプラクティスであるため、ほとんど私はそれを追加しました。 :) – MSeifert

関連する問題