将列表的列表转换为字典。

3

如何用这些列表创建一个字典列表

temp = [['header1', '4', '8', '16', '32', '64', '128', '256', '512', '243,6'], ['media_range', '1,200', '2,400', '4,800', '4,800', '6,200', '38,400', '76,800', '153,600', '160,000'], ['speed', '300', '600', '1,200', '2,000', '2,000', '2,000', '2,000', '2,000', '2,000']]

字典的头部是列表的第一个元素。

期望输出为:

output= [{'header1': '4', 'media_range': '1,200', 'speed': '300'}, {'header1': '8', 'media_range': '2,400', 'speed': '600'}, ...]

理想情况下,代码应该能够处理任意数量的列表(在此例中是3个)。

在 temp 中的列表长度总是相同的吗? - timgeb
@timgeb 很好的问题,是的,它们确实会有,但不总是10(如问题中)。 - goku
3个回答

4

IIUC

>>> temp = [['header1', '4', '8', '16', '32', '64', '128', '256', '512', '243,6'], ['media_range', '1,200', '2,400', '4,800', '4
...: ,800', '6,200', '38,400', '76,800', '153,600', '160,000'], ['speed', '300', '600', '1,200', '2,000', '2,000', '2,000', '2,0
...: 00', '2,000', '2,000']]                                                                                                    
>>>                                                                                                                             
>>> keys = [l[0] for l in temp]                                                                                                 
>>> values = [l[1:] for l in temp]                                                                                              
>>> dicts = [dict(zip(keys, sub)) for sub in zip(*values)]                                                                                                             
>>>                                                                                                                                                                    
>>> dicts                                                                                                                                                              
[{'header1': '4', 'media_range': '1,200', 'speed': '300'},
 {'header1': '8', 'media_range': '2,400', 'speed': '600'},
 {'header1': '16', 'media_range': '4,800', 'speed': '1,200'},
 {'header1': '32', 'media_range': '4,800', 'speed': '2,000'},
 {'header1': '64', 'media_range': '6,200', 'speed': '2,000'},
 {'header1': '128', 'media_range': '38,400', 'speed': '2,000'},
 {'header1': '256', 'media_range': '76,800', 'speed': '2,000'},
 {'header1': '512', 'media_range': '153,600', 'speed': '2,000'},
 {'header1': '243,6', 'media_range': '160,000', 'speed': '2,000'}]

什么是IIUC? - uingtea
如果我理解正确的话,@uingtea是最懒的方法,可以在答案前加上前缀,使其不仅仅是代码。 - timgeb

1
稍微更短的解决方案,使用 zip 和解包:

temp = [['header1', '4', '8', '16', '32', '64', '128', '256', '512', '243,6'], ['media_range', '1,200', '2,400', '4,800', '4,800', '6,200', '38,400', '76,800', '153,600', '160,000'], ['speed', '300', '600', '1,200', '2,000', '2,000', '2,000', '2,000', '2,000', '2,000']]
header, *data = zip(*temp)
result = [dict(zip(header, i)) for i in data]

输出:

[{'header1': '4', 'media_range': '1,200', 'speed': '300'}, {'header1': '8', 'media_range': '2,400', 'speed': '600'}, {'header1': '16', 'media_range': '4,800', 'speed': '1,200'}, {'header1': '32', 'media_range': '4,800', 'speed': '2,000'}, {'header1': '64', 'media_range': '6,200', 'speed': '2,000'}, {'header1': '128', 'media_range': '38,400', 'speed': '2,000'}, {'header1': '256', 'media_range': '76,800', 'speed': '2,000'}, {'header1': '512', 'media_range': '153,600', 'speed': '2,000'}, {'header1': '243,6', 'media_range': '160,000', 'speed': '2,000'}]

0
你可以使用zip()函数。这需要你知道有多少个列表,但会得到预期的输出结果。
for header1,media_range,speed in zip(temp[0], temp[1], temp[2]):
    if header1 != "header1":
        output.append({temp[0][0]: header1, temp[1][0]: media_range, temp[2][0]: speed})

它可以完成这项工作,但不太具有可扩展性。 - goku

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