列表字典转换为普通字典

6
我有一个字典列表,例如{'a': [1, 2, 3], 'b': [5, 6, 7, 8]}。实际数据中可能有多个键/值对。我想要显示一个详尽的字典列表,每行一个字典,其中每个字典都具有相同的键,并且每个值都是从相应的原始列表中选择的元素。
因此,对于这个输入,结果将如下所示:
{'a': 1, 'b': 5}
{'a': 1, 'b': 6}
...
{'a': 3, 'b': 8}

输出总共有3 * 4 = 12行。

对于硬编码的关键字,我可以做到这一点:

for a, b in itertools.product(*p.itervalues()):
    print({'a':a, 'b':b})

然而,对于真实数据,我不一定提前知道键名,并且可能有未知数量的键值对。

我应该如何修改代码,使其无论键名如何,都可以从itertools.product生成所需的字典?


2
你能展示一个字典里有三个键的例子吗? - thefourtheye
1个回答

12

不要将product结果解包到单独的变量中,只需将其与原始键进行zip

from itertools import product

for i in product(*p.values()):
    print(dict(zip(p, i)))

我对此有疑问。p.valuesp.keys的“顺序”会是相同的吗? - Jayanth Koushik
1
我本来想用那个解决方案回答自己的问题,但我不确定p.keys的顺序。我有一种感觉它不可靠! - mchangun
请查看ParameterGrid中的__iter __() https://github.com/scikit-learn/scikit-learn/blob/0.14.X/sklearn/grid_search.py。这正是我想要的。 - mchangun
1
你可以直接压缩 pi,节省重复创建键列表的时间。 - user2357112
该死,Python 真是太强大了。由于我对 itertools 缺乏实践经验,我花了半个小时才想出一个递归解决方案。 - timgeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接