Циклические вложенные значения словаря - PullRequest
1 голос
/ 26 марта 2019

Мне нужна способность в первом цикле проходить через глубоко вложенные свойства диктата. Это дает мне часть пути (https://stackoverflow.com/a/10756615/5932433), но результат не то, что мне нужно.

Учитывая следующую структуру данных:

data = {
  "a": {
    "c": 1,
    "d": 3,
  },
  "b": {
    "e": 2,
    "f": 4,
  }
}

Мне нужен метод, который будет возвращать следующее:

for _, v in cycle(tree_iter(data)):
  print v

# 1 (a -> c)
# 2 (b -> e)
# 3 (a -> d)
# 4 (b -> f)
# 1
# 2
# 3
# 4
# ...etc...

Это метод, который я сейчас использую для tree_iter:

def tree_iter(nested):
    for key, value in nested.iteritems():
        if isinstance(value, Mapping):
            for inner_key, inner_value in tree_iter(value):
                yield inner_key, inner_value
        else:
            yield key, value

Обратите внимание, что порядок не должен быть гарантирован, если он последовательный. Каждая итерация должна циклически проходить через a / b, а затем циклически проходить через вложенные значения.

1 Ответ

0 голосов
/ 26 марта 2019

Ваш текущий код, похоже, выполняет DFS, поэтому вы можете вернуть список списков из DFS, сжать их, а затем сгладить.Не самый элегантный, но он должен работать.

def tree_iter_dfs(nested):
    for key, value in nested.iteritems():
        if isinstance(value, Mapping):
            yield value.items()
        else:
            yield [(key, value)]

# https://stackoverflow.com/a/952952/5309823
def flatten(l):
    return [item for sublist in l for item in sublist]

def tree_iter_bfs(nested):
    dfs = tree_iter_dfs(nested)
    return flatten(zip(*dfs))

print(list(tree_iter_bfs(data)))
# [('c', 1), ('e', 2), ('d', 3), ('f', 4)]

При необходимости измените вещи на итерируемые;Я не знал, какую версию Python вы используете и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...