2017-09-16 3 views
-1

は、私は、このコードは2行で書くことができることをは、SetDefaultメソッドまたはラムダ使用していることを感じてい:このコードは2行で記述できますか?

variables = ['a','b','c','d'] 
for value in indefinite_dict.values(): 
    str1 = immediate_instantiation.get(value) 
    if str1 == None: 
     immediate_instantiation.update({value:variables[0]}) 
     del variables[0] 

それはindefinite_dictの値をループし、それらを置くとし、その値がまだない場合即時インスタンス化辞書のキーを押すと、変数リストの最初のメンバーの値でその辞書にエントリとして追加され、変数リストの最初のメンバーが削除されます。

+0

'変数[0]'は何ですか? –

+0

それは手紙のリストです。 – bobsmith76

+0

'変数 'とは何かを追加したコンテキストと、それを含む必要があるものがより良い解決策を作り出すのに役立つかもしれません。 – Ryan

答えて

1

あなたはvariablesの値はそのキーが同じ値を持っている場合、対応するキーが既にimmediate_instantiationに存在していても削除されると大丈夫だ場合、あなたはあなただけsetdefaultでそれを行うことができますことをおっしゃるとおり

for value in indefinite_dict.values(): 
    if immediate_instantiation.setdefault(value, variables[0]) is variables[0]: 
     del variables[0] 

他のコンテキストなしで2つのラインにそれを取得するには、しかし、異なる(および種類の不快な)アプローチを取ります。

updates = (v for v in indefinite_dict.values() if v not in immediate_instantiation) 
immediate_instantiation.update({v: variables.pop(0) for v in updates}) 

indefinite_dictOrderedDictである方が良いでしょう。そうしないと、潜在的にランダムな順序で変数が削除されてしまいます。 (このためのPython 3.6のdictの表現に依存しないでください。)

をあなたはこのvariablesが少なくとも同じ長updatesなどであることが保証されるが、非変異解決された後variablesを必要としない場合非常にクリーン、ノート:

updates = (v for v in indefinite_dict.values() if v not in immediate_instantiation) 
immediate_instantiation.update(zip(updates, variables)) 
+0

クール、私はその解決が好きです – bobsmith76

0

一行ソリューション:

immediate_instantiation.update({value: variables.pop(0) for value in indefinite_dict.values() if value not in immediate_instantiation}) 
+0

あなたと同じソリューションを投稿するためにここに来ました。あなたがなぜ搾取されたのか分かりません。 –

関連する問題