Двойной l oop над вложенным словарем в Python - PullRequest
0 голосов
/ 03 марта 2020

У меня есть вложенный словарь в Python, например:

funcs = {1:{-1:{'a': 1, 'b': 2}, 0:{'a': 3, 'b': 4}, 1:{'a': 5, 'b': 6}},
2:{-2:{'a': 7, 'b': 8}, -1:{'a': 9, 'b': 10}, 0:{'a': 11, 'b': 12}, 1:{'a': 13, 'b': 14}, 2:{'a': 15, 'b': 16}}}

Он имеет три уровня вложенных словарей:

  • первый уровень m ключи запускаются из 1 до некоторого N (здесь N = 2)
  • ключи второго уровня n работают от -m до m: для m=1 это -1, 0, 1, для m=2, это -2,-1,0,1,2
  • третий уровень p клавиши работают над 'a' и 'b'
  • значения 1, 2, 3, ..., 16 являются только примерами значений.

Мне нужно запустить функцию g(x,y) для каждой возможной пары значений на самом низком уровне словаря (т.е. операций 16x16). Очевидно, что я могу сделать это, запустив все ключи в 6-вложенном l oop, но я надеялся на что-то более эффективное и pythoni c.

Если внешний уровень имел только m = 1 полученная матрица будет выглядеть так:

g(f[1][-1][a], f[1][-1][a]), g(f[1][-1][a], f[1][-1][b]), g(f[1][-1][a], f[1][0][a]), g(f[1][-1][a], f[1][0][b]), g(f[1][-1][a], f[1][1][a]), g(f[1][-1][a], f[1][1][b])
g(f[1][-1][b], f[1][-1][a]), g(f[1][-1][b], f[1][-1][b]), g(f[1][-1][b], f[1][0][a]), g(f[1][-1][b], f[1][0][b]), g(f[1][-1][b], f[1][1][a]), g(f[1][-1][b], f[1][1][b])
g(f[1][0][a], f[1][-1][a]), g(f[1][0][a], f[1][-1][b]), g(f[1][0][a], f[1][0][a]), g(f[1][0][a], f[1][0][b]), g(f[1][0][a], f[1][1][a]), g(f[1][0][a], f[1][1][b])
g(f[1][0][b], f[1][-1][a]), g(f[1][0][b], f[1][-1][b]), g(f[1][0][b], f[1][0][a]), g(f[1][0][b], f[1][0][b]), g(f[1][0][b], f[1][1][a]), g(f[1][0][b], f[1][1][b])
g(f[1][1][a], f[1][-1][a]), g(f[1][1][a], f[1][-1][b]), g(f[1][1][a], f[1][0][a]), g(f[1][1][a], f[1][0][b]), g(f[1][1][a], f[1][1][a]), g(f[1][1][a], f[1][1][b])
g(f[1][1][b], f[1][-1][a]), g(f[1][1][b], f[1][-1][b]), g(f[1][1][b], f[1][0][a]), g(f[1][1][b], f[1][0][b]), g(f[1][1][b], f[1][1][a]), g(f[1][1][b], f[1][1][b])

Ответы [ 2 ]

1 голос
/ 03 марта 2020
  • Я думаю, вам нужно использовать itertools.product.
  • Сначала получите список всех чисел, для которых вы хотите создать комбинации. Затем с помощью itertools.product создайте перестановку чисел.
import itertools
funcs = {1:{-1:{'a': 1, 'b': 2}, 0:{'a': 3, 'b': 4}, 1:{'a': 5, 'b': 6}},
2:{-2:{'a': 7, 'b': 8}, -1:{'a': 9, 'b': 10}, 0:{'a': 11, 'b': 12}, 1:{'a': 13, 'b': 14}, 2:{'a': 15, 'b': 16}}}

l = []
for k,v in funcs.items():
    for k1, v1 in v.items():
        l.extend(v1.values())

print(l)

combi = list(itertools.product(l, repeat=2))

# call fucn of each of combi
for val in combi:
    # print(foo(combi))
    pass

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

0 голосов
/ 03 марта 2020

IIU C, например, если вы хотите суммировать пары значений a,b и поместить их в список:

funcs = {1:{-1:{'a': 1, 'b': 2}, 0:{'a': 3, 'b': 4}, 1:{'a': 5, 'b': 6}},
2:{-2:{'a': 7, 'b': 8}, -1:{'a': 9, 'b': 10}, 0:{'a': 11, 'b': 12},
1:{'a': 13, 'b': 14}, 2:{'a': 15, 'b': 16}}}

def g(funcs):

    return [sum(v2.values()) for v in funcs.values() for v2 in v.values()]

Вывод:

[3, 7, 11, 15, 19, 23, 27, 31]

Пожалуйста скажите, если вам нужно более конкретное c приложение, которое нелегко обобщить из этого.

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