Доступ к вложенным уровням диктов без вложенных циклов

У меня есть словарь, который содержит результаты моделирования различных протоколов для различных значений n ("протоколы" и n не имеют отношения к проблеме, с которой я сталкиваюсь). Этот словарь имеет следующую структуру:

myDict = {"protocol1" : {1:[some list of numbers], 2:[another list of numbers]},
          "protocol2" : {1:[some list of numbers], 2:[another list of numbers]},
         }

Теперь, чтобы проанализировать результаты, я бы сделал что-то вроде этого:

for protocol, stats in myDict.items():
  for n, counts in stats.items():
    # do stuff with protocol, n and counts

Интересно, хотя, существует ли какой-то набор встроенных модулей, которые позволяют мне делать это, без необходимости определять собственный итератор:

for protocol, n, counts in magicFunc(myDict):
  # do stuff with protocol, n and counts

Есть ли что-то в itertools возможно, это позволяет мне сделать это?

2 ответа

Решение

Не уверен, что это лучше... Я бы придерживался того, что у вас есть для вашего примера, но если бы он стал глубже, чем что-то вроде:

myDict = {
    'p1': {1: [1, 2, 3], 2: [4, 5, 6]},
    'p2': {3: [7, 8, 9], 4: [0, 1, 2]}
}

from collections import Mapping

def go_go_gadget_go(mapping):
    for k, v in mapping.items():
        if isinstance(v, Mapping):
            for ok in go_go_gadget_go(v):
                yield [k] + ok
        else:
            yield [k] + [v]

for protocol, n, counts in go_go_gadget_go(myDict):
    print(protocol, n, counts)

# p2 3 [7, 8, 9]
# p2 4 [0, 1, 2]
# p1 1 [1, 2, 3]
# p1 2 [4, 5, 6]

Если вам не нужно использовать protocol, ты можешь использовать itertools.chain.from_iterable с map:

import itertools
for n, counts in itertools.chain.from_iterable(map(dict.items, myDict.values())):
    # do stuff with n and counts
Другие вопросы по тегам