将字典值转换为字典键值对

hen*_*ich 2 python

我有一个字典项目列表如下:

[{'answer_type': 'Yes', 'answer__count': 5}, {'answer_type': 'No', 
'answer__count': 3}, {'answer_type': 'Maybe', 'answer__count': 2}]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为以下形式:

[{'Yes': 5}, {'No': 3}, {'Maybe': 2}]
Run Code Online (Sandbox Code Playgroud)

我知道我可以遍历字典,拉出我想要的项目并创建一个新字典,但我想知道是否有更优雅的方式.进行此转换的最有效方法是什么?谢谢.

nyr*_*r1o 8

假设您的词典列表被调用data.

然后您可以使用以下代码转换它:

newdata = [{dic['answer_type']: dic['answer__count']} for dic in data]
Run Code Online (Sandbox Code Playgroud)

如果您不太了解此代码,请查看Python理解


Nic*_*ers 2

假设您的数据存储在 中d,有几种方法可以做到这一点:

列表理解

对于每个可迭代对象,您都可以使用列表理解,因此可以使用 迭代项目[it for it in iterable](您也可以在字典中使用列表理解)。

In [6]: [{dic['answer_type']: dic['answer__count']} for dic in d]
Out[6]: [{'Yes': 5}, {'No': 3}, {'Maybe': 2}]
Run Code Online (Sandbox Code Playgroud)

功能性方法

如果您更喜欢函数式编程,请考虑使用 map 它将函数应用于可迭代的每个元素(这是我的首选方法,如果我必须使用列表一次又一次地执行此操作,我只需定义然后运行一次):

In [2]: map(lambda dic: {dic['answer_type']: dic['answer__count']}, d)
Out[2]: [{'Yes': 5}, {'No': 3}, {'Maybe': 2}]
Run Code Online (Sandbox Code Playgroud)

对于某些人来说这不如列表理解那么好读,对于某些人来说更好,取决于个人感受。这适用于 python2,在 py3 中它为您提供了一个迭代器,因此您必须使用listaround the map 来获取列表。