从键和多个值的列表中创建字典

6

我有两个列表:

header = ["Name", "Age"]
detail = ["Joe", 22, "Dave", 43, "Herb", 32]

我希望创建一个像这样的字典列表:

[{"Name": "Joe", "Age": 22}, {"Name": "Dave", "Age": 32}, {"Name": "Herb", "Age": 32}]

这种方法zip可以实现部分功能,但只会将第一组值添加到字典中:
>>> dict(zip(header, detail))
{'Age': 22, 'Name': 'Joe'}

如何将detail列表中所有值输出为一个字典?我在这个答案中找到了方法,但这取决于detail包含嵌套的列表。

2
你为什么需要 header 列表?你没有用它做任何事情。 - Mu Mind
抱歉造成困惑,已更新问题中的预期输出以包括“header”值。 - Bryan
4个回答

9
>>> detail = ["Joe", 22, "Dave", 43, "Herb", 32]
>>> d = dict(zip(detail[::2], detail[1::2]))
>>> d
{'Herb': 32, 'Dave': 43, 'Joe': 22}

针对您的新/编辑问题:

>>> d = [dict(zip(header, items)) for items in zip(detail[::2],detail[1::2])]
>>> d
[{'Age': 22, 'Name': 'Joe'}, {'Age': 43, 'Name': 'Dave'}, {'Age': 32, 'Name': 'H
erb'}]

2

以下是其中一种获取它的方法:

header = ["Name", "Age"]
detail = ["Joe", 22, "Dave", 43, "Herb", 32]
data_iter = iter(detail)
collated = []
while True:
    next_data = zip(header, data_iter)
    if not next_data:
        break
    collated.append(dict(next_data))

输出结果为

[{'Age': 22, 'Name': 'Joe'},
 {'Age': 43, 'Name': 'Dave'},
 {'Age': 32, 'Name': 'Herb'}]

这个版本的优点是,如果您更改标题数,无需更改代码。


2

对于这样的任务,我更喜欢使用函数式方法。

这里有一个关于grouper的示例

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

通过使用它,我们可以按组进行2的详细进阶:

>>> groups = grouper(len(header),detail)
>>> list(groups)
[('Joe', 22), ('Dave', 43), ('Herb', 32)]

然后我们可以使用这个迭代器按需创建字典:

>>> [dict(zip(header,group)) for group in groups]
[{'Age': 22, 'Name': 'Joe'}, {'Age': 43, 'Name': 'Dave'}, {'Age': 32, 'Name': 'Herb'}]

为了澄清,zip(header,group) 的输出如下:

>>> zip(["Name", "Age"],('Joe', 22))
[('Name', 'Joe'), ('Age', 22)]

调用 dict 构造函数将得到以下结果:

>>> dict([('Name', 'Joe'), ('Age', 22)])
{'Age': 22, 'Name': 'Joe'}

最好使用 len(header) 而不是 2,因为你已经有了它。 - Mu Mind

1
>>> header = ["Name", "Age"]
>>> detail = ["Joe", 22, "Dave", 43, "Herb", 32]
>>> [dict(zip(header,detail[i:i+2])) for i in range(0,len(detail),2)]
[{'Age': 22, 'Name': 'Joe'}, {'Age': 43, 'Name': 'Dave'}, {'Age': 32, 'Name': 'Herb'}]`

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