Как проверить список элементов, присутствующих во вложенном словаре в Python?

#python-3.x

#python-3.x

Вопрос:

 l = ["a","b"]
d = {
    "val1": { "a": {"a1": "vfvf", "a2": "ghbnnhn"},
              "b": {"b1": "gghh", "b2": "nhghbfb"},
              "c": {"c1": "fgggfgf ","c2 ":"hhggbfvfv"}
            },
    "val2": { "d": {"d1": "vfvf", "d2": "ghbnnhn"},
              "e": {"e1": "gghh", "e2": "nhghbfb"},
              "a": {"a_1": "fgggfgf ","a_2 ":"hhggbfvfv"}
            }
}
  

Нужно проверить list 'l' и print dictionary elements of corresponding list element .

Код

 for k,v in d.items():
    if "a" in v:
        print(d[k][a])
    if "b" in v:
        print(d[k][b])
  

Я думаю, что описанный выше подход является утомительным и отнимает много времени. Может ли это быть optimised вместо two if loops , как показано ниже?

 for k,v in d.items():
      if any(l) in v:
         print(d[k][whichever_element_matches_above])
  

Или любой другой лучший подход, чем этот?

Ответ №1:

Вы можете сделать это в двойном понимании:

 to_print = [
    v2 
    for k,v in d.items()
    for k2,v2 in v.items()
    if k2 in l
]
print(to_print)
# [{'a1': 'vfvf', 'a2': 'ghbnnhn'}, {'b1': 'gghh', 'b2': 'nhghbfb'}, {'a_1': 'fgggfgf ', 'a_2 ': 'hhggbfvfv'}]
  

Ответ №2:

Если вы хотите использовать только один цикл for, вы можете использовать пакет itertools. Пример:

 import itertools

l = ["a","b"]
d = {
    "val1": { "a": {"a1": "vfvf", "a2": "ghbnnhn"},
              "b": {"b1": "gghh", "b2": "nhghbfb"},
              "c": {"c1": "fgggfgf ","c2 ":"hhggbfvfv"}
            },
    "val2": { "d": {"d1": "vfvf", "d2": "ghbnnhn"},
              "e": {"e1": "gghh", "e2": "nhghbfb"},
              "a": {"a_1": "fgggfgf ","a_2 ":"hhggbfvfv"}
            }
}

    
keys_list = list(d.keys())
values_list = list(d.values())

for i, j in itertools.product(l,d.values()):
        if i in j:
            print(keys_list[values_list.index(j)],':', i, ':', j[i])
  

или

Вы можете использовать приведенный ниже код с двумя циклами for:

 for i in l:
    for j in d.values():
        if i in j:
            print(i, ':', j[i])
  

Комментарии:

1. Любые возможности с одним циклом for?

2. Вы можете использовать itertools, я добавил пример кода с itertools в свой комментарий

3. Спасибо. Возможно ли включить «val1» и «val2» в вывод соответственно?

4. Я имею в виду, нам не хватает для печати ключей ‘val1’ и ‘val2’.

5. Конечно, я обновил свой код, чтобы печатать ключи словаря d также