zip dict.items()列表中的多个dicts?

时间:2016-11-25 16:17:05

标签: python dictionary zip items

我认为这应该很简单,但无法找到简单而优雅的解决方案。 我有这个:

l = [{1: 1, 2: 2},
     {'a': 'a', 'b': 'b'}]

我想要这个:

l = [((1, 1), ('a', 'a')),
     ((2, 2), ('b', 'b'))]

如何将列表中多个dicts的项目压缩在一起?

1 个答案:

答案 0 :(得分:1)

Python 3

在Python 3中,dict.items返回dict_items个对象。为了防止这种情况,您可以通过执行以下操作将它们全部转换为元组:

list(zip(*map(dict.items, l)))

zip(*<iterable>)将迭代扩展为zip的参数,然后zip将参数压缩为元组(有效地将所有值转换为元组)。

然而,这在过程中非常冗余地构建了多个列表。这可以通过以下方式避免:

list(map((lambda d: tuple(d.items())), l))
# Or with multiple maps:
list(map(tuple, map(dict.items, l))))

可以说,这更直观,但确实使用lambda或多个地图,因此对于较小的字典列表效率较低。

Python 2

在Python 2中,dict.items会返回list。如果你没有特别需要列表上的元组,那么将它们保存为列表就可以了,map(dict.items, l)就足够了。

在这里,您可以执行与上述相同的操作(省略list(...),因为zip会返回一个列表:

zip(*map(dict.items, l))

您也可以简单地映射tuple

map(tuple, map(dict.items, l))
# Or with a lambda:
map((lambda d: tuple(d.items())), l)