2017-12-11 9 views
0

時のアクセス辞書は、私はこのようなコードを持っています最初のコードボックスで、ディクテーションの理解に?Pythonのdictの理解作成

+1

あなたが直接それを複製することはできません。私のコードも減速が付属して、それをループに数回は、なりながら はまた、あなたの実装では、あなたは、一度だけあなたの辞書を通過します。 'dict'はまだ存在しません。 –

+0

dictを並べ替えることができます。 –

+1

その2番目の条件は次のように単純化することができます: 'dictionary [key] = max(value、dictionary.get(key、None)' – wwii

答えて

1

あなたがやっているすべては、あなたが「最大の理解」を使用することができますmaxですので:しかし

dict_of_x = (
    {'key':0,'value':0,'duration_to_cancel':10}, 
    {'key':0,'value':1,'duration_to_cancel':15}, 
    {'key':0,'value':2,'duration_to_cancel':1}, 
    {'key':1,'value':3,'duration_to_cancel':2}, 
    {'key':2,'value':4,'duration_to_cancel':None} 
) 

def yours(): 
    dictionary = {} 
    for x in dict_of_x: 
     if x['duration_to_cancel'] == None or x['duration_to_cancel'] > 5: 
     key = x['key'] 
     value = x['value'] 
     if key not in dictionary or value > dictionary[key]: 
      dictionary[key] = value 
    return dictionary 
print yours() 

{0: 1, 2: 4} 

def mine(): 
    dictionary = {key : max(x['value'] for x in dict_of_x if x['key'] == key) \ 
     for key in set(x['key'] for x in dict_of_x if x['duration_to_cancel'] == None or x['duration_to_cancel'] > 5)} 
    return dictionary 
print mine() 

{0: 1, 2: 4} 

注意をそのリスト/ dict/set/maxの理解は読みやすさにとって必ずしも良いことではありません。

%timeit yours() 
1000000 loops, best of 3: 855 ns per loop 


%timeit mine() 
100000 loops, best of 3: 2.32 µs per loop 
0

高い値が低い値を上書きするよう、それが動作するはずです、これを試してみてください:

dictionary = {x['key'] : x['value'] for x in sorted(dict_of_x, key=lambda x: x['value']) \ 
      if (True if x['duration_to_cancel'] == None else x['duration_to_cancel'] > 5)} 
+1

これは、私の答えに記述されているのと同じような時間ペナルティで来るでしょうまた、x ['duration_to_cancel'] ==他の場合はtrue x ['duration_to_cancel ']> 5) 'x [' duration_to_cancel '] == Noneまたはx [' duration_to_cancel ']> 5' ... – Julien

+0

@Julien True ..私は2番目部。私はそれらの編集をOPに任せます。 –

関連する問題