Переменное число циклов в функции (python)
Вот пример того, что я хотел бы сделать:
d1 = {'a':1,'b':2,'c':3}
d2 = {'aa':11,'bb':22,'cc':33}
d3 = {'aaa':111,'bbb':222,'ccc':333}
def nLoop(*args):
n = len(args)
if n == 1:
for k0,v0 in args[0].iteritems():
print k0, v0
if n == 2:
for k0,v0 in args[0].iteritems():
for k1,v1 in args[1].iteritems():
print k0, v0, k1, v1
if n == 3:
for k0,v0 in args[0].iteritems():
for k1,v1 in args[1].iteritems():
for k2,v2 in args[2].iteritems():
print k0, v0, k1, v1, k2, v2
nLoop(d1,d2,d3)
Мой вопрос: есть ли какие-то способы сделать это без условий if? Может быть, с помощью декораторов?
1 ответ:
Вы можете передать свой список переменных аргументов в
itertools.product
(с генератором comprenehsion для преобразования диктов в их элементы), а затем распечатать сглаженные результаты (так какproduct
возвращает кортежи кортежей):from __future__ import print_function import itertools d1 = {'a':1,'b':2,'c':3} d2 = {'aa':11,'bb':22,'cc':33} d3 = {'aaa':111,'bbb':222,'ccc':333} def nLoop(*args): for t in itertools.product(*(a.items() for a in args)): print(*(x for a in t for x in a)) nLoop(d1,d2,d3)
Вывод этой новой функции
nLoop
идентичен вашему (если порядок не учитывается, так как порядок словаря может меняться между запусками)Обратите внимание, что это решение совместимо с Python 3, но также работает с Python 2.