将列表列表转换为字典时的Python KeyError

时间:2013-02-24 03:06:13

标签: python list dictionary keyerror

我坚持这个简单的任务。我有一个列表列表,我需要将它转换为字典,但到目前为止没有任何成功。

我尝试使用下面的代码,但它给了我KeyError:0

list = [[3,0,7,4,5],[2,3,0,1,2],[6,6,7,6,6]]

d = {}
for x in list:
    i = 0
    for number in x:
        d[i].append(number)
        i += 1

我需要它像这样:

{0: [3,2,6], 1: [0,3,6], 2: [7,0,7], 3: [4,1,6], 4: [5,2,6]}

感谢任何帮助,提前谢谢!

2 个答案:

答案 0 :(得分:4)

作为旁注,您可以使用enumeratezip函数轻松完成此操作。

lst = [[3, 0, 7, 4, 5], [2, 3, 0, 1, 2], [6, 6, 7, 6, 6]]
d = dict(enumerate(zip(*lst)))
  • zip(*lst)基本上是转置功能。它返回Python 2中的列表,或Python 3中的zip对象,可以将其转换为等效列表。

    [(3, 2, 6), (0, 3, 6), (7, 0, 7), (4, 1, 6), (5, 2, 6)]
    
  • enumerate()基本上只是在它之前添加元素的索引,并返回一个enumerate对象,当转换为列表时返回一个元组列表。

    [(0, (3, 2, 6)), (1, (0, 3, 6)), (2, (7, 0, 7)), (3, (4, 1, 6)), (4, (5, 2, 6))]
    
  • dict()获取元组列表并将其转换为键/值对。

    {0: (3, 2, 6), 1: (0, 3, 6), 2: (7, 0, 7), 3: (4, 1, 6), 4: (5, 2, 6)}
    

答案 1 :(得分:2)

请不要将内置插件用作ID。

>>> lst = [[3, 0, 7, 4, 5], [2, 3, 0, 1, 2], [6, 6, 7, 6, 6]]

您第一次打电话时收到KeyError

d[i].append(number)

这是因为i中没有键d。让我们看看使用enumerate()zip(),而不是修复此代码,这可能更像是“Pythonic”:

>>> d = dict(enumerate(zip(*lst)))
>>> d
{0: (3, 2, 6), 1: (0, 3, 6), 2: (7, 0, 7), 3: (4, 1, 6), 4: (5, 2, 6)}

对于新的Python用户来说,这可能有点令人生畏。让我分解一下。

>>> zip(*lst)
[(3, 2, 6), (0, 3, 6), (7, 0, 7), (4, 1, 6), (5, 2, 6)]

unpacks列表zip(),将三个较小的列表“拉链”在一起。

>>> enumerate(zip(*lst)

返回对的迭代器。每对都是一个索引(从0开始)和输入中的项目。

>>> dict(enumerate(zip(*lst)))

dict()函数返回一个新的字典对象,使用传入的键值对进行初始化。