2016-07-21 22 views
2

辞書の理解を使用している間に、辞書のフィルタリングに問題があります。辞書の理解を使って辞書をフィルタリングする

私はdictの持っている:

clients = { 
     'Shop': {'url' : 'url_v', 'customer' : 'cumoster_v', 
       'some_other_key1' : 'some_value'}, 
     'Gym': {'url' : 'url_v1', 'customer_1' : 'customer_v1', 'customer_2': 'customer_v2', 
       'some_other_key2' : 'some_value'}, 
     'Bank': {'url' : 'url_v2', 'customer_3' : 'customer_v3',  
        'some_other_key3' : 'some_value'} 
} 

を私は持っています別の辞書作りたいキーの顧客を* '。 だから、新しい辞書がどのように見えるはずです。これでそれを行うことが可能であるならば、私はリストとdicts理解の大ファンだとして

​​

、私は思ったんだけど。

はこれまでのところ、私が書いた:

dict_only_cust = {v.pop(t) for k, v in clients.items() 
       for t, vv in v.items() 
       if not re.match('.*customer.*', t)} 

コードは、私が試した'RuntimeError: dictionary changed size during iteration'

二時間で失敗します。それはほとんどOKです

dict_only_cust = {k:{t: vv} for k, v in clients.items() 
       for t, vv in v.items() 
       if re.match('.*customer.*', t)} 

、それが戻っています

dict_only_cust = { 
       'Shop' : {'customer' : 'cumoster_v'}, 
       'Gym' : {'customer_1' : 'customer_v1'}, 
       'Bank' : {'customer_3' : 'customer_v3'} 
} 

どのようにdictの理解を使用してこの問題を解決するには? 私はPython 3.4を使用しています。

ありがとうございます!

答えて

4
>>> {key:{k:v for k,v in dic.items() if 'customer' in k} for key,dic in clients.items()} 
{'Shop': {'customer': 'cumoster_v'}, 'Gym': {'customer_2': 'customer_v2', 'customer_1': 'customer_v1'}, 'Bank': {'customer_3': 'customer_v3'}} 
+0

どうもありがとう!トリッキーで美しいソリューション! – Dzawor

2
{k:{k1:v1 for k1,v1 in v.items() if k1.startswith('customer')} for k, v in clients.items()} 

出力:

{'Shop': {'customer': 'cumoster_v'}, 'Gym': {'customer_2': 'customer_v2', 'customer_1': 'customer_v1'}, 'Bank': {'customer_3': 'customer_v3'}} 
+0

@pwnsauce、Corrected –