2013-06-28 66 views
0

我有兩個類型的字典:與字典理解刪除嵌套的字典項

blocked = {'-5.00': ['121', '381']} 
all_odds = {'-5.00': '{"121":[1.85,1.85],"381":[2.18,1.73],"16":[2.18,1.61],"18":\ 
      [2.12,1.79]}'} 

我想先檢查.keys()對比(==)是否返回True,在這裏它(既-5.00),那麼我想刪除所有來自all_odds的項目具有列於blocked.values()中的關鍵字。

對於它上面應該導致:

all_odds_final = {'-5.00': '{"16":[2.18,1.61],"18": [2.12,1.79]}'} 

我試圖for loop

if blocked.keys() == all_odds.keys(): 
    for value in blocked.values(): 
     for v in value: 
      for val in all_odds.values(): 
       val = eval(val) 
       if val.has_key(v): 
        del val[v] 

,你知道是很醜陋再加上它的不正常呢。

+0

你打算有一個嵌套的字典,而不是一個字符串,正確的? – Jared

+0

@Jared正確。 – nutship

+0

但是,你似乎正在使用'eval'這意味着你想要一個字符串?請相應地編輯您的問題。 :) –

回答

1

首先,使字符串成爲一個字典ast.literal_eval()Don't use eval()

>>> import ast 
>>> all_odds['-5.00'] = ast.literal_eval(all_odds['-5.00']) 

然後你可以使用字典解析:

>>> if blocked.keys() == all_odds.keys(): 
...  print {blocked.keys()[0] : {k:v for k, v in all_odds.values()[0].iteritems() if k not in blocked.values()[0]}} 
... 
{'-5.00': {'18': [2.12, 1.79], '16': [2.18, 1.61]}} 

但是如果你想要的-5.00作爲一個字符串值...

>>> {blocked.keys()[0]:str({k: v for k, v in all_odds.values()[0].iteritems() if k not in blocked.values()[0]})} 
{'-5.00': "{'18': [2.12, 1.79], '16': [2.18, 1.61]}"} 
+0

清潔和美麗。感謝'ast.literal_eval'提示:) – nutship

1

這裏是你如何能做到約2行相同。我不打算在這裏使用ast或eval,但如果你想使用它,你可以添加。

>>> blocked = {'-5.00': ['121', '381']} 
>>> all_odds = {'-5.00': {'121':[1.85,1.85],'381':[2.18,1.73],'16':[2.18,1.61],'18':\ 
...  [2.12,1.79]}} 
>>> bkeys = [k for k in all_odds.keys() if k in blocked.keys()] 
>>> all_odds_final = {pk: {k:v for k,v in all_odds.get(pk).items() if k not in blocked.get(pk)} for pk in bkeys} 
>>> all_odds_final 
{'-5.00': {'18': [2.12, 1.79], '16': [2.18, 1.61]}} 
1

這似乎工作:

blocked = {'-5.00': ['121', '381']} 
all_odds = {'-5.00': {"121":[1.85,1.85],"381":[2.18,1.73],"16":[2.18,1.61],"18":\ 
     [2.12,1.79]}} 
all_odds_final = dict(all_odds) 
for key, blocks in blocked.iteritems(): 
    map(all_odds_final[key].pop,blocks,[]) 

如果你不想複製的字典,你可以彈出項目從原來的all_odds詞典:

for key, blocks in blocked.iteritems(): 
    map(all_odds[key].pop,blocks,[]) 

空map函數中的列表是這樣的,pop被None調用,因爲它是第二個參數。沒有它彈出只有一個參數,並會返回一個錯誤,如果該鍵不存在。