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的剃刀,但这并不意味着我改变了问题。这个解决方案仍然解决了他的问题。