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

Bry*_*yan 4 python

我有两个清单:

header = ["Name", "Age"]
detail = ["Joe", 22, "Dave", 43, "Herb", 32]
Run Code Online (Sandbox Code Playgroud)

并希望创建一个像这样的dictonaries列表:

[{"Name": "Joe", "Age": 22}, {"Name": "Dave", "Age": 32}, {"Name": "Herb", "Age": 32}]
Run Code Online (Sandbox Code Playgroud)

这个方法zip部分地在那里,但只将第一组值添加到字典中:

>>> dict(zip(header, detail))
{'Age': 22, 'Name': 'Joe'}
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ker 7

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

对于您的新/编辑问题:

>>> 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'}]
Run Code Online (Sandbox Code Playgroud)


ovg*_*vin 2

对于此类任务,我更喜欢函数式方法。

这是石斑鱼的食谱

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)
Run Code Online (Sandbox Code Playgroud)

通过使用它,我们可以detail按组推进槽2

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

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

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

为了澄清zip(header,group)这一点,给出:

>>> zip(["Name", "Age"],('Joe', 22))
[('Name', 'Joe'), ('Age', 22)]
Run Code Online (Sandbox Code Playgroud)

并调用dict构造函数给出:

>>> dict([('Name', 'Joe'), ('Age', 22)])
{'Age': 22, 'Name': 'Joe'}
Run Code Online (Sandbox Code Playgroud)