首页 > 解决方案 > 根据第一个元素从元组列表创建字典

问题描述

我有一个看起来像这样的元组列表:

[('name', 'Name'),('name','Age'),('name','Hometown'),('value','Bob'),('value',27),('value','Chicago'),('name','Home Team'),('name','Away Team'),('name','Score'),('value','Broncos'),('value','Patriots'),('name','Month'),('value','January'),...]

本质上这是一堆桌子。例如,第一个表将具有标题“姓名”、“年龄”和“家乡”,条目将是“鲍勃”、27 岁、“芝加哥”。

我试图把它变成这样的一本字典:{'Name':'Bob','Age':27,'Hometown':'Chicago, 'Home Team':'Broncos',...}

我相信我可以在正常情况下执行此操作,但是如果您查看第二个“表”,则有 3 个标题和只有 2 个值。在这种情况下,有没有办法将前两个“名称”映射到前两个“值”,并将第三个('Score')映射到空字符串?

标签: pythonlistdictionarytuples

解决方案


我认为这行得通。可能不是真的漂亮,但如果你有几个缺失值的片段,它应该是坚固的,并且不需要改变原始列表......虽然我刚刚学会了zip_longest。谢谢@Zunayn

一点点while循环结构可以解决这个问题:

data = [('name', 'Name'),('name','Age'),('name','Hometown'),('value','Bob'),('value',27),('value','Chicago'),
('name','Home Team'),('name','Away Team'),('name','Score'),('value','Broncos'),('value','Patriots'),('name','Month'),('value','January')]

# reverse the data for more efficient pop()
data = data[::-1]

results = {}
d = data.pop()
while data:
    keys = []
    while d[0] == 'name':
        keys.append(d[1])
        d = data.pop()
    values = []
    while d[0] == 'value':
        values.append(d[1])
        if data:   # need to watch for end of list
            d = data.pop()
        else:
            break
    missing = len(keys) - len(values)
    values.extend(['na']*missing)

    # zip intermediate results and add to result
    results.update({k:v for (k, v) in zip(keys, values)})

print(results)

产量:

{'Name': 'Bob', 'Age': 27, 'Hometown': 'Chicago', 'Home Team': 'Broncos', 'Away Team': 'Patriots', 'Score': 'na', 'Month': 'January'}

推荐阅读