[英]Is there an easier way of transforming these python objects
我想转换以下python输入:
[{'paramA': ['valA1','valA2','valA3','valA4']},
{'paramB': ['valB1','valB2','valB3','valB4']},
{'paramC': ['valC1','valC2','valC3','valC4']},
# ...........................................,
{'paramN': ['valN1', 'valN2','valN3','valN4']}]
至以下输出:
[{'paramA': 'valA1','paramB': 'valB1', 'paramC': 'valC1', ...,'paramN':'valN1' }
{'paramA': 'valA2','paramB': 'valB2', 'paramC': 'valC2', ...,'paramN':'valN2' }
{'paramA': 'valA3','paramB': 'valB3', 'paramC': 'valC3', ...,'paramN':'valN3' }
{'paramA': 'valA4','paramB': 'valB4', 'paramC': 'valC4', ...,'paramN':'valN4' } ]
我能想到的唯一功能是:
def transformParams( inputParams ):
res = []
for i in inputParams:
for k,v in i.items():
for ind, inv in enumerate(v):
if len(res) <= ind:
res.append({})
res[ind][k] = inv
return res
我是Python的新手,我认为可以使用列表推导以更简单的Python方式完成此操作。 谁能提供更好的答案?
首先将输入列表中的所有内容合并到一个字典中; 这样,您可以使用zip()
将所有值转换为行,然后将其与键重新组合:
try:
# use efficient Python 3 version in Python 2
from future_builtins import zip
except ImportError:
# Python 3
pass
combined = reduce(lambda d1, d2: dict(d1, **d2), inputlist)
result = [dict(zip(combined, col)) for col in zip(*combined.values())]
所述zip()
函数从输入对向上的元件一起列出,从而产生与所有第一元件,一个元组,那么所有第二等的*
在zip(*list_of_lists)
呼叫应用所有包含在从合并的字典序列(这里所有的列表值)作为单独的参数,然后zip()
进行配对。 本质上,这会将行转置为列序列。
然后将这些列序列与键重新组合(再次使用zip()
进行配对)以形成输出字典。
演示:
>>> inputlist = [
... {'paramA': ['valA1','valA2','valA3','valA4']},
... {'paramB': ['valB1','valB2','valB3','valB4']},
... {'paramC': ['valC1','valC2','valC3','valC4']},
... # ...........................................,
... {'paramN': ['valN1', 'valN2','valN3','valN4']}]
>>> combined = reduce(lambda d1, d2: dict(d1, **d2), inputlist)
>>> [dict(zip(combined, col)) for col in zip(*combined.values())]
[{'paramN': 'valN1', 'paramC': 'valC1', 'paramB': 'valB1', 'paramA': 'valA1'}, {'paramN': 'valN2', 'paramC': 'valC2', 'paramB': 'valB2', 'paramA': 'valA2'}, {'paramN': 'valN3', 'paramC': 'valC3', 'paramB': 'valB3', 'paramA': 'valA3'}, {'paramN': 'valN4', 'paramC': 'valC4', 'paramB': 'valB4', 'paramA': 'valA4'}]
>>> from pprint import pprint
>>> pprint(_)
[{'paramA': 'valA1', 'paramB': 'valB1', 'paramC': 'valC1', 'paramN': 'valN1'},
{'paramA': 'valA2', 'paramB': 'valB2', 'paramC': 'valC2', 'paramN': 'valN2'},
{'paramA': 'valA3', 'paramB': 'valB3', 'paramC': 'valC3', 'paramN': 'valN3'},
{'paramA': 'valA4', 'paramB': 'valB4', 'paramC': 'valC4', 'paramN': 'valN4'}]
l = [
{"paramA": ["valA1","valA2","valA3","valA4"]},
{"paramB": ["valB1","valB2","valB3","valB4"]},
{"paramC": ["valC1","valC2","valC3","valC4"]},
]
output = [dict([(line.keys()[0], line.values()[0][index]) for line in l]) for index in range(len(l[0].values()[0]))]
print(output)
这就是我想出的。 不是很漂亮,但是可以完成工作。 此外,这要求值的长度始终相同,并且字典的第一个键和值是所需的参数和值。
编辑:忽略此答案。 Martijn Pieters的答案更加美观和可读!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.