Python 如何将dict keyx:valuex列表转换为dict key:keyx,value:valuex列表?

Python 如何将dict keyx:valuex列表转换为dict key:keyx,value:valuex列表?,python,Python,所以我有这样一个列表: [ { '1234' : 'Sun'} { '353453' : 'Earth'} ... ] 我想把这个转换成 [ { 'temp': '1234', 'planet' : 'Sun'} { 'temp': '353453', 'planet': 'Earth'} ... ] 转换此dict列表的Python方式是什么?您可以使用嵌套列表/字典: lst = [ { '1234' :

所以我有这样一个列表:

  [ 
    { '1234' : 'Sun'}
    { '353453' : 'Earth'}
    ...
  ]
我想把这个转换成

  [ 
    { 'temp': '1234', 'planet' : 'Sun'}
    { 'temp': '353453', 'planet': 'Earth'}
    ...
  ]

转换此dict列表的Python方式是什么?

您可以使用嵌套列表/字典:

lst =   [ 
    { '1234' : 'Sun'},
    { '353453' : 'Earth'}
  ]

out = [ { 'temp': k, 'planet': v } for l in lst for k, v in l.items() ]

# [{'temp': '1234', 'planet': 'Sun'}, {'temp': '353453', 'planet': 'Earth'}]

在我的脑海中,我会写下这样的话:

>>> l = [{ '1234' : 'Sun'}, { '353453' : 'Earth'}]
>>> r = [{'temp':list(x.keys())[0], 'planet': x[list(x.keys())[0]]}  for x in l if len(x) == 1]
核心问题是,这只适用于格式正确的输入数据结构,而输入格式无法保证这一点。因此,事先验证输入数据可能是有用的

但如果我必须在生产代码中加入这种东西,我肯定会避免使用@François Dailloux建议的oneliner,而是编写下面愚蠢而简单的代码,这也是非常可读的,而且可能更快:

l = [{ '1234' : 'Sun'}, { '353453' : 'Earth'}]
res = []
for d in l:
    if len(d) == 1:
        for k, v in d.items():
            res.append('temp': k, 'planet': v)

如果len不是预期的那样,我当然也会提出一些异常,以避免传播损坏的输入数据。

您不应该尝试在一行中执行,它将不可读。您应该为每个元素逐个构造输出列表

稍后将阅读您的代码的人(这可能是您自己在几个月后)将感谢您

你可以这样做

a = [{'1234': 'Sun', "12": "mars"}]

output = []
for measurement in a:
    output_list_of_dict = [{"temp": temp, "planet": planet} for temp, planet in measurement.items()]
    output.extend(output_list_of_dict)

请注意,在每个循环中,结果都是一个列表本身:一个字典可能包含多个温度。因此,我使用了«扩展»方法,它合并列表,而不是追加

以一种明确易读的方式执行它符合python哲学


从这个意义上讲,它是最具python风格的。

这在Python3上不起作用,您需要在
x.keys()
上添加
list
如下:
list(x.keys())
否则会出现错误
TypeError:“dict\u keys”对象不可下标
对;如果您喜欢非嵌套列表组件,我将在lst中为d修复它或
[dict(zip('temp','planet'),*d.items())
。@timgeb nice!我花了很长时间才弄清楚到底发生了什么。这很好,但你肯定改变了你答案中的问题。最初的海报从来没有说一个词汇表可以包含几对行星/温度。如果允许的话,为什么要使用几个词汇呢?如果你这样做的话,为什么不针对同一个星球采取一些措施呢。无论如何,我都投了赞成票,因为我同意使用oneliner(为了可读性,避免使用它)。但你并不是真的在回答这个问题。他确实从来没有说过,只是从他发布的口述来看,这似乎是有可能的。但是它仍然有效,即使你在每个dict中只有一个键值。而且,他没有说它可以包含几个温度测量值,但没有说它只包含一个,只是Occam的剃刀,但这并不意味着我改变了问题。这个解决方案仍然解决了他的问题。