【问题标题】:Turn a dictionary of lists in to a list of dictionaries in Python 2.7在 Python 2.7 中将列表字典转换为字典列表
【发布时间】:2014-07-28 03:34:16
【问题描述】:

我有这个

original = {
   "state_id": "1,2",
   "name": "A,B"
}

我可以轻松上交

original_splitted = {k: v.split(',') for k, v in original.iteritems()}
{
   "state_id": ['1', '2'],
   "name": ['A' ,'B']
}

但我想要的是这样的:

[
    {"state_id": '1', "name": "A"}, 
    {"state_id": '2', "name": "B"} 
]

我正在寻找一种很酷的“单线”理解魔法来实现这一点(避免使用大型嵌套循环)

【问题讨论】:

  • 这几乎就像你想pivot your dict。我在想一个很酷的单行代码会让人难以理解。

标签: python list python-2.7 dictionary dictionary-comprehension


【解决方案1】:

使用zip(*) 和列表理解的 2-liner 怎么样:

>>> vals = zip(*(x.split(',') for x in original.itervalues()))
>>> [dict(zip(original, v)) for v in vals]
[{'state_id': '1', 'name': 'A'}, {'state_id': '2', 'name': 'B'}]

【讨论】:

  • izip 无法阻止 splat 将 (x.split(',') for x in original.itervalues()) 变成一个参数元组,所以我怀疑它会起到多大的作用。
  • 另外,值得注意的是 dict 的迭代顺序保证不会改变而 dict 不会改变,因此您可以安全地使用 v 压缩 dict 而不必担心键被映射到错误的值。
  • @user2357112 啊!是的。删除了那部分。
  • 这样一行就可以搞定[dict(zip(original, v)) for v in zip(*(x.split(',') for x in original.itervalues()))]
猜你喜欢
  • 2015-07-23
  • 2016-12-05
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2021-10-13
  • 2018-08-21
相关资源
最近更新 更多