Skip to main content
 首页 » 编程设计

python之有没有更简单的方法来转换这些 python 对象

2025年05月04日26yyy_WW

我想转换以下 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 的新手,我认为这可以使用列表理解以更简单的 Pythonic 方式完成。谁能提供更好的答案?

请您参考如下方法:

首先将输入列表中的所有内容加入一个字典;这样您就可以使用 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() function将输入列表中的元素配对在一起,生成一个包含所有第一个元素的元组,然后是所有第二个元素,等等。 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'}]