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

6

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

[{'answer_type': 'Yes', 'answer__count': 5}, {'answer_type': 'No', 
'answer__count': 3}, {'answer_type': 'Maybe', 'answer__count': 2}]

我希望你能将其转换为以下形式:
[{'Yes': 5}, {'No': 3}, {'Maybe': 2}]

我知道可以循环遍历字典,提取我想要的条目并创建一个新的字典,但我想知道是否有更优雅的方式。如何高效地进行此转换?谢谢。

2个回答

9
假设你的字典列表名为data,你可以使用以下代码进行转换:
newdata = [{dic['answer_type']: dic['answer__count']} for dic in data]

如果您不太理解这段代码,请参考Python推导式

列表/字典推导式总是看起来很酷。 - Sunnysinh Solanki
问题中使用了两个下划线 answer__count,而不是一个。 - Sean Breckenridge
哦,没注意到有两个下划线,我修改了 ;) - nyr1o

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}]

函数式编程方法

如果你更倾向于函数式编程,可以考虑使用map函数,它会将一个函数应用到可迭代对象的每个元素上(如果我需要反复对一个列表执行此操作,这是我首选的方法,因为我只需要定义一次函数即可):

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

对于某些人来说,这种写法可能不如列表推导式易读;而对于另一些人,它可能更好。这种写法适用于Python2,在py3中它会返回一个迭代器,所以你需要使用list将map转为列表。


请检查您的理解结果。第一个理解代码是不正确的,因为字典是无序的,所以不能使用它。这将产生不稳定的结果,意味着有时会出现{yes:5},有时会出现{5:yes}。您的第二个理解代码是正确的,但结果并不是它生成的结果。 - FatihAkici

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