Я полагаю, вам нужно декартово произведение всех ключей? Итак, если бы у вас была другая запись, «foo», со значениями [1, 2, 3], то всего у вас было бы 18 записей?
Сначала поместите значения в список, где каждая запись является одним из возможных вариантов в этом месте. В вашем случае мы хотим:
[[{'debug': 'on'}, {'debug': 'off'}], [{'locale': 'de_DE'}, {'locale': 'en_US'}, {'locale': 'fr_FR'}]]
Для этого:
>>> stuff = []
>>> for k,v in variants.items():
blah = []
for i in v:
blah.append({k:i})
stuff.append(blah)
>>> stuff
[[{'debug': 'on'}, {'debug': 'off'}], [{'locale': 'de_DE'}, {'locale': 'en_US'}, {'locale': 'fr_FR'}]]
Затем мы можем использовать декартову функцию произведения, чтобы расширить его...
>>> def cartesian_product(lists, previous_elements = []):
if len(lists) == 1:
for elem in lists[0]:
yield previous_elements + [elem, ]
else:
for elem in lists[0]:
for x in cartesian_product(lists[1:], previous_elements + [elem, ]):
yield x
>>> list(cartesian_product(stuff))
[[{'debug': 'on'}, {'locale': 'de_DE'}], [{'debug': 'on'}, {'locale': 'en_US'}], [{'debug': 'on'}, {'locale': 'fr_FR'}], [{'debug': 'off'}, {'locale': 'de_DE'}], [{'debug': 'off'}, {'locale': 'en_US'}], [{'debug': 'off'}, {'locale': 'fr_FR'}]]
Обратите внимание, что это не копирует словари, поэтому все словари {'debug': 'on'}
одинаковы.
person
Claudiu
schedule
06.10.2010