将 Python 字典排列组合到字典列表中

Posted

技术标签:

【中文标题】将 Python 字典排列组合到字典列表中【英文标题】:Combine Python Dictionary Permutations into List of Dictionaries 【发布时间】:2013-02-19 03:10:05 【问题描述】:

给定一个看起来像这样的字典:


    'Color': ['Red', 'Yellow'],
    'Size': ['Small', 'Medium', 'Large']

如何创建一个包含第一个字典键的各种值的字典列表?我想要的是:

[
    'Color': 'Red', 'Size': 'Small',
    'Color': 'Red', 'Size': 'Medium',
    'Color': 'Red', 'Size': 'Large',
    'Color': 'Yellow', 'Size': 'Small',
    'Color': 'Yellow', 'Size': 'Medium',
    'Color': 'Yellow', 'Size': 'Large'
]

【问题讨论】:

如果您向我们展示您的尝试,这将是一个很好的问题。 我想说无论如何这是一个好问题,因为在这里想出正确的概念并不容易。 【参考方案1】:

我认为您想要笛卡尔积,而不是排列,在这种情况下itertools.product 可以提供帮助:

>>> from itertools import product
>>> d = 'Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']
>>> [dict(zip(d, v)) for v in product(*d.values())]
['Color': 'Red', 'Size': 'Small', 'Color': 'Red', 'Size': 'Medium', 'Color': 'Red', 'Size': 'Large', 'Color': 'Yellow', 'Size': 'Small', 'Color': 'Yellow', 'Size': 'Medium', 'Color': 'Yellow', 'Size': 'Large']

【讨论】:

+1。很高兴知道 Python 以相同的、可重复的顺序遍历字典项,对于 zip().values() @TimPietzcker:是的,这个属性是documented 并且可以依赖。顺序本身是任意的,但任何兼容的 Python 实现都不会违反保证,即如果您不修改 dd.keys()(此处为 d)和 d.values() 必须匹配。 这正是我想要的!谢谢。 谢谢!这是完美的。 我认为从 python 3.7 开始,字典顺序也不再是任意的了!另见here【参考方案2】:

您可以通过以下方式获得该结果:

x='Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']
keys=x.keys()
values=x.values()

matrix=[]
for i in range(len(keys)):
     cur_list=[]
     for j in range(len(values[i])):
             cur_list.append(keys[i]: values[i][j])
     matrix.append(cur_list)

y=[]
for i in matrix[0]:
     for j in matrix[1]:
             y.append(dict(i.items() + j.items()))

print y

结果:

['Color': 'Red', 'Size': 'Small', 'Color': 'Red', 'Size': 'Medium', 'Color': 'Red', 'Size': 'Large', 'Color': 'Yellow', 'Size': 'Small', 'Color': 'Yellow', 'Size': 'Medium', 'Color': 'Yellow', 'Size': 'Large']

【讨论】:

以上是关于将 Python 字典排列组合到字典列表中的主要内容,如果未能解决你的问题,请参考以下文章

分治法实现1-N的数字按字典序全排列组合 Java语言

Python递归集合值排列字典

Uva10098 按字典序求排列组合

按字典顺序排列 1...n 的 k 的组合,算法太慢

2022-01-07:下一个排列。实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。 如果不存在下一个更大的排列,则将数字重新排列成

Python - 加快列表排列的生成(以及检查字典中是不是排列的过程)