Полный возврат всех возможных комбинаций словаря Python - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу вернуть все возможные комбинации клавиш словаря Python.В моем случае это двухуровневый словарь иерархии.

Моя первая попытка выглядит как псевдокодоподобная последовательность циклов for.Это работает, но это уродливо и становится очень больно, если у меня много данных.

Я хочу выполнить ту же задачу с помощью подхода, основанного на диктовке.

Вот моя попытка.Используя эту технику, я мог легко получить много - слишком много - циклов.

dic = {
    'Sex' : {'Man' : 0, 'Woman' : 1}, 
    'Age group' : {'0-14yrs' : 0, '15-25yrs' : 1, '26-35yrs' : 2}
}

for x in range(len(list(dic['Sex'].keys()))):
    for y in range(len(list(dic['Age group'].keys()))):
        sex = list(dic['Sex'].keys())[x]
        age = list(dic['Age group'].keys())[y]
        print(sex,age)


Man 0-14yrs
Man 15-25yrs
Man 26-35yrs
Woman 0-14yrs
Woman 15-25yrs
Woman 26-35yrs

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Если вы хотите, чтобы ваше решение было как можно более общим, вы можете сделать что-то подобное:

from itertools import product
product(*dic.values())

Это даст вам генератор со следующими значениями:

[(«Мужчина», «0-14 лет»), («Мужчина», «15-25 лет»), («Мужчина», «26–35 лет»), («Женщина», «0-14 лет»), ('Женщина', '15-25 лет '), (' Женщина ', '26 -35 лет')]

0 голосов
/ 21 февраля 2019

Я бы использовал itertools.product.

for sex, age in itertools.product(dic['Sex'], dic['Age group']):
    print(sex, age)

product возвращает генератор кортежей, который вы можете делать с тем, что вам нравится.

Для произвольного dict,где вы не обязательно знаете ключи или их порядок заранее, я бы сначала пометил каждое значение его ключом.

>>> for t in list(itertools.product(*[[(k, v) for v in dic[k] ] for k in dic])):
...   print(t)
...
(('Age group', '15-25yrs'), ('Sex', 'Woman'))
(('Age group', '15-25yrs'), ('Sex', 'Man'))
(('Age group', '0-14yrs'), ('Sex', 'Woman'))
(('Age group', '0-14yrs'), ('Sex', 'Man'))
(('Age group', '26-35yrs'), ('Sex', 'Woman'))
(('Age group', '26-35yrs'), ('Sex', 'Man'))

Теперь вы, по крайней мере, знаете «тип» каждого значения в соответствующем кортеже;это не зависит от какого-либо конкретного порядка, включающего оригинал dict.

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