以全面的方式返回python字典的所有可能组合

2024-04-18 19:03:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想返回python字典的所有可能的键组合。 在我的例子中,它是一个两层结构的字典。你知道吗

我的第一次尝试看起来像一个伪代码一样的for循环序列。它工作,但它是丑陋的,它会变得非常痛苦,如果我有很多数据。你知道吗

我想用听写理解法做同样的任务。你知道吗

这是我的尝试。使用这种技术,我可以很容易地得到很多-太多-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

Tags: inforagelen字典grouprangekeys
2条回答

如果您希望您的解决方案尽可能通用,您可以这样做:

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

这将为您提供一个具有以下值的生成器:

[('Man', '0-14yrs'), ('Man', '15-25yrs'), ('Man', '26-35yrs'), ('Woman', '0-14yrs'), ('Woman', '15-25yrs'), ('Woman', '26-35yrs')]

我会用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的特定顺序。你知道吗

相关问题 更多 >