1

我有以下数据结构:{'one':['a','b','c'],'two':['q','w','e'],'three':['t','u','y'],...}. 所以,字典有不同的键数。由 dict 的键选择的每个数组都具有相似的长度。如何将此结构转换为以下结构:[{'one':'a','two':'q','three':'t'},{'one':'b','two':'w','three':'y'},...]

我想我应该使用 itertools.izip(),但是我如何在没有预定义的 args 计数的情况下应用它?也许是这样的:itertools.izip([data[l] for l in data.keys()])

蒂亚!

4

2 回答 2

2

不是非常优雅,但可以做到:

In [9]: [{k:v[i] for (k,v) in d.items()} for i in range(len(d.values()[0]))]
Out[9]: 
[{'one': 'a', 'three': 't', 'two': 'q'},
 {'one': 'b', 'three': 'u', 'two': 'w'},
 {'one': 'c', 'three': 'y', 'two': 'e'}]

我不禁想到必须有更好的方法来表达i循环,但现在什么都没有想到。

或者:

In [50]: map(dict, zip(*[[(k, v) for v in l] for k, l in d.items()]))
Out[50]: 
[{'one': 'a', 'three': 't', 'two': 'q'},
 {'one': 'b', 'three': 'u', 'two': 'w'},
 {'one': 'c', 'three': 'y', 'two': 'e'}]

不确定这是否在可读性方面有很大的改进。

于 2013-01-24T17:28:47.963 回答
1

您对使用izip的评估是正确的,但使用它的方式不太正确

你首先需要

  • 将项目作为元组列表(键,值)获取,(iteritems()如果使用 Py2.x 或使用 Py3.x,items()则使用方法)
  • 创建键和值的标量积
  • 展平列表(使用 itertools.chain)
  • 压缩它(使用 itertools.izip)
  • 然后为每个元素创建一个字典

这是示例代码

>>> from pprint import PrettyPrinter
>>> pp = PrettyPrinter(indent = 4)
>>> pp.pprint(map(dict, izip(*chain((product([k], v) for k, v in data.items())))))
[   {   'one': 'a', 'three': 't', 'two': 'q'},
    {   'one': 'b', 'three': 'u', 'two': 'w'},
    {   'one': 'c', 'three': 'y', 'two': 'e'}]
>>> 
于 2013-01-24T17:29:00.280 回答