将一个包含列表的字典转换为一个字典列表

3

我有以下的字典对象:

Input = {'userName': ['psrr_api@auto-grid.com', 'ps_api1@auto-grid.com'],
         'password': ['Everseeource2016!', 'Eversource2016!']}

这将导致特定输出结果:
output = [{'UserName':'ps_api@auto-grid.com','password': 'Eversource2016!'},
          {'userName':'ps_api1@auto-grid.com','password':'Eversource2016!'}]

我不确定如何解决这个问题,希望能得到帮助。

3个回答

4

使用zip函数同时迭代两个列表。使用字典构造器列表推导式中创建独立的字典,以自动循环处理。

Input = {'userName': ['psrr_api@auto-grid.com', 'ps_api1@auto-grid.com'], 'password': ['Everseeource2016!', 'Eversource2016!']}

Output = [ {'UserName':u, 'password':p} for u,p in zip(Input['userName'], Input['password']) ]

2
在许多NoSQL引擎中,数据通常以嵌套的方式存储,对于您的情况,它将是:
{'ID_1':
    {
    'username':'psrr_api@auto-grid.com',
    'password': 'Everseeource2016'
    },
'ID_2':{
    'username':'ps_api1@auto-grid.com',
    'password': 'Eversource2016!'
    }
}

这提供了一种通过ID高效访问数据的方式。 更多示例 以下是格式转换的代码: 此代码是通用的,意味着您不必指定键,在这种情况下为usernamepassword
from collections import defaultdict
data = defaultdict(dict)
for idx in range(len(Input.values()[0])):
    for key in Input.keys():
        data['ID_'+str(idx)].update({key: Input[key][idx]})
print data

1
如果你需要一个可变数量的键,可以将代码推广到以下形式:

代码:

keys = [(k,) * len(data[k]) for k in data.keys()]
data_vals = [data[k] for k in data.keys()]
output = [dict(kv) for kv in
          (zip(*pairs) for pairs in zip(zip(*keys), zip(*data_vals)))]

测试代码:
data = {'userName': ['psrr_api@auto-grid.com', 'ps_api1@auto-grid.com'],
         'password': ['Everseeource2016!', 'Eversource2016!']}

for i in output:
    print(i)

输出:

{'userName': 'psrr_api@auto-grid.com', 'password': 'Everseeource2016!'}
{'userName': 'ps_api1@auto-grid.com', 'password': 'Eversource2016!'}

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