我想返回python字典的所有可能的组合键。 就我而言,它是一个两层的层次结构字典。
我的第一次尝试似乎是for循环的类似伪代码的序列。它可以工作,但是很难看,如果我有很多数据,它会变得非常痛苦。
我想用dict-comprehension方法执行相同的任务。
这是我的尝试。使用这种技术,我很容易就为循环带来了很多(太多)。
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
答案 0 :(得分:4)
我会使用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
的任何特定顺序。
答案 1 :(得分:1)
如果您希望解决方案尽可能通用,则可以执行以下操作:
from itertools import product
product(*dic.values())
这将为您提供具有以下值的生成器:
[('Man','0-14yrs'),('Man','15 -25yrs'),('Man','26 -35yrs'), ('女人','0-14yrs'),('女人','15 -25yrs'),('女人','26 -35yrs')]