2017-11-24 4 views
1

私はクラスラボで作業しています。たとえば、別の辞書であるkeyとvalueという辞書があります。Pythonの辞書フィルタリングするものを取り除く

辞書A:

dict_a = { 
    1: { 
     'Engine': 4, 
     'Speed': 749, 
     'max_speed': 1140, 
     'name': 'Ship1', 
    }, 

    2: { 
     'Engine': 2, 
     'Speed': 600, 
     'max_speed': 900, 
     'name': 'B777', 
    }, 

    3: { 
     'Engine': 4, 
     'Speed': 1130, 
     'max_speed': 1200, 
     'name': 'Air_max', 
    } 
} 

私は例えば2つの引数(辞書A、およびフィルタの辞書を)取る関数を記述しようとしています:

filter = { 
    'Engine' :4, 
    'name': 'Air_max', 
} 

この関数を返す必要があります値>またはフィルタと等しい辞書を含むリスト:

これは単なる例に過ぎません。私はちょうどこれを行うヒントのアイデアが必要です。実際、私の辞書Aは非常に大きいです。

これまでのところ、私はこれを持って右見てない:

filtered = { 
    'Engine': 2, 
    'Speed': 300, 
    'Type': 'Electric' 
} 

result = [] 
for k, v in full_data.items(): 
    for i, s in v.items(): 
     for a, b in filtered.items(): 
      if v[i] >= filtered[a]: 
       result.append(v) 
filtered_result = [] 
for each in result: 
    if each not in filtered_result: 
     filtered_result.append(each) 
filtered_result[:3] 
+2

あなたがそれらを反復する必要がある場合は、辞書の目的を破る "辞書"のように見えます。 –

+0

あなたは 'dict'の' list'と 'dict'の' dict'ではなく、キーが基本的にインデックスだけであるように思えます。 –

+0

フィルタリングコードにはどのような問題がありますか?それはまったく動作しませんか?それは遅すぎますか?どのような結果が得られますか? –

答えて

0

正直なところ、この部分は混乱のビットのようだ:

for k, v in full_data.items(): 
    for i, s in v.items(): 
     for a, b in filtered.items(): 
      if v[i] >= filtered[a]: 
       result.append(v) 

kv識別子は素晴らしいです、簡潔かつ慣用的で​​ある。 is個、それほどです。そして、あなたがfilteredと書いたときにあなたがfilterを意味していたと思う。とにかく、ヘルパー関数を書くことをお勧めします。述語is_wanted(data, filter)は、フィルタ条件が満たされたときにTrueを返します。ループとは別にヘルパー関数をテストすることができます。

次に、ループに戻り、述語を呼び出すと、変数にわかりやすい名前を付けることを検討してください。全体的にあなたは正しい軌道にいるようです。

0

あなたはこれを試すことができます。

出力:

[{1: {'Engine': 4, 'max_speed': 1140, 'Speed': 749, 'name': 'Ship1'}}, {3: {'Engine': 4, 'max_speed': 1200, 'Speed': 1130, 'name': 'Air_max'}}] 

あなたの代わりに、リストの辞書の場合:

new_dict_a = {a:b for a, b in dict_a.items() if b['Engine'] >= filter['Engine']} 

出力:

{1: {'Engine': 4, 'max_speed': 1140, 'Speed': 749, 'name': 'Ship1'}, 3: {'Engine': 4, 'max_speed': 1200, 'Speed': 1130, 'name': 'Air_max'}} 
を3210
+0

答えをありがとう。しかし、フィルタダイスが固定されていないと、私はそれがキーとダイスの値を提供するために使用することを意味します。ユーザーはエンジンをスキップすることもできます。また、買い物を価値に絞り込むこともできます。 – user3035168