2013-06-28 3 views
0

У меня есть два dicts:Удаление вложенных элементов Dict с Dict понимания

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() Comparision (==) 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

Вы хотели иметь вложенный dict, а не строку, правильно? – Jared

+0

@ Исправлено. – 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,[]) 

Пустое список в функции карты так, что pop вызывается с None, поскольку это второй аргумент. Без него pop получает только один аргумент и возвращает ошибку, если ключ отсутствует.