Я пытаюсь обернуть мой мозг вокруг этого, но он недостаточно гибок.
В моем скрипте Python у меня есть словарь словарей списков. (На самом деле все становится немного глубже, но этот уровень не затрагивается этим вопросом.) Я хочу объединить все это в один длинный список, отбросив все ключи словаря.
Таким образом, я хочу преобразовать
{1: {'a': [1, 2, 3], 'b': [0]},
2: {'c': [4, 5, 1], 'd': [3, 8]}}
до
[1, 2, 3, 0, 4, 5, 1, 3, 8]
Возможно, я мог бы настроить map-Reduce для перебора элементов внешнего словаря, чтобы построить подсписок из каждого поддиректория, а затем объединить все подсписки вместе.
Но это кажется неэффективным для больших наборов данных из-за промежуточных структур данных (подсписков), которые будут выброшены. Есть ли способ сделать это за один проход?
За исключением этого, я был бы рад принять двухуровневую реализацию, которая работает ... моя карта редуцирована!
Обновление:
Для тех, кто заинтересован, ниже приведен код, который я использовал в итоге.
Обратите внимание, что, хотя я попросил список для вывода, мне действительно нужен был отсортированный список; то есть выходной результат выравнивания может быть любым итеративным, который можно отсортировать.
def genSessions(d):
"""Given the ipDict, return an iterator that provides all the sessions,
one by one, converted to tuples."""
for uaDict in d.itervalues():
for sessions in uaDict.itervalues():
for session in sessions:
yield tuple(session)
...
# Flatten dict of dicts of lists of sessions into a list of sessions.
# Sort that list by start time
sessionsByStartTime = sorted(genSessions(ipDict), key=operator.itemgetter(0))
# Then make another copy sorted by end time.
sessionsByEndTime = sorted(sessionsByStartTime, key=operator.itemgetter(1))
Еще раз спасибо всем, кто помог.
[Обновление: заменено nthGetter () на operator.itemgetter (), благодаря @intuited.]