将列表解析为字典Python中的字典

时间:2017-09-02 12:53:43

标签: python python-2.7 dictionary nested

数据集:

id = [1,2,3]
header = ['name','attack','defense']
stats = [['John',12,30], ['Amy',32,89], ['Lisa',45,21]]

我想以嵌套字典的形式获得输出。外部字典的键将是id,值将是包含其他数据的字典。即:

dict = {
    1: {'name': 'John', 'attack': 12, 'defense': 30}, 
    2: {'name': 'Amy', 'attack': 32, 'defense': 89},
    3: {'name': 'Lisa', 'attack': 45, 'defense': 21}
}

这是我目前的代码:

dict = {}
for i in id:
    next_input = {}
    for index, h in enumerate (header):
        for sublist in stats:
            next_input[h] = sublist[index]
    dict[i] = next_input

由于最后一个for循环,它无法正常工作。内部词典的价值只是替换自己直到最后一个子列表。

如何更正此代码?

4 个答案:

答案 0 :(得分:1)

您不需要遍历统计信息子列表;使用您选择的enumerate()选项,您必须在id循环中添加索引并选择正确的统计信息:

dict = {}
for id_index, i in enumerate(id):
    next_input = {}
    for h in enumerate (header):
        next_input[h] = sublist[id_index][index]
    dict[i] = next_input

但是,您可以使用zip() function配对两个列表进行并行迭代:

result = {i: dict(zip(header, stat)) for i, stat in zip(id, stats)}

这使用dictionary comprehension来构建从id值到相应stats条目的外部映射。内部字典只是从配对的标头和统计信息构建(dict()采用一系列(key, value)对)。

演示:

>>> id = [1,2,3]
>>> header = ['name','attack','defense']
>>> stats = [['John',12,30], ['Amy',32,89], ['Lisa',45,21]]
>>> {i: dict(zip(header, stat)) for i, stat in zip(id, stats)}
{1: {'attack': 12, 'defense': 30, 'name': 'John'}, 2: {'attack': 32, 'defense': 89, 'name': 'Amy'}, 3: {'attack': 45, 'defense': 21, 'name': 'Lisa'}}
>>> from pprint import pprint
>>> pprint(_)
{1: {'attack': 12, 'defense': 30, 'name': 'John'},
 2: {'attack': 32, 'defense': 89, 'name': 'Amy'},
 3: {'attack': 45, 'defense': 21, 'name': 'Lisa'}}

答案 1 :(得分:0)

你可以试试这个:

id = [1,2,3]
header = ['name','attack','defense']
stats = [['John',12,30], ['Amy',32,89], ['Lisa',45,21]]

new_dict = {a:{d:c for c, d in zip(b, header)} for a, b in zip(id, stats)}

输出:

{1: {'attack': 12, 'defense': 30, 'name': 'John'}, 2: {'attack': 32, 'defense': 89, 'name': 'Amy'}, 3: {'attack': 45, 'defense': 21, 'name': 'Lisa'}}

答案 2 :(得分:0)

另一个zip()变体:

d = {}
for i,s in enumerate(stats):
    d[id[i]] = dict((zip(header, s)))

print(d)

输出:

{1: {'attack': 12, 'name': 'John', 'defense': 30}, 2: {'attack': 32, 'name': 'Amy', 'defense': 89}, 3: {'attack': 45, 'name': 'Lisa', 'defense': 21}}

答案 3 :(得分:0)

使用 zip() list comphersion

>> dict(zip(id ,[dict(zip(header,item)) for item in stats]))

{1: {'attack': 12, 'defense': 30, 'name': 'John'}, 2: {'attack': 32, 'defense': 89, 'name': 'Amy'}, 3: {'attack': 45, 'defense': 21, 'name': 'Lisa'}}

首先使用标题

压缩统计信息中的每个项目
>>> [dict(zip(header,item)) for item in stats]

[{'attack': 12, 'defense': 30, 'name': 'John'}, {'attack': 32, 'defense': 89, 'name': 'Amy'}, {'attack': 45, 'defense': 21, 'name': 'Lisa'}]

带有第一个输出的第二个zip id

>>> zip(id,[dict(zip(header,item)) for item in stats])

[(1, {'attack': 12, 'defense': 30, 'name': 'John'}), (2, {'attack': 32, 'defense': 89, 'name': 'Amy'}), (3, {'attack': 45, 'defense': 21, 'name': 'Lisa'})]