2013-02-24 75 views
0

我被困在这个简单的任务中。我有一个列表清单,我需要将其转换为字典,但迄今没有任何成功。将列表转换为字典时出现Python 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]} 

任何帮助表示赞赏,谢谢提前!

+0

避免命名阵列'list'。它可以混合使用函数'list()' – TerryA 2013-02-24 03:10:03

回答

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)} 
    
+0

非常感谢主席先生,你救了我的一天! – user2103666 2013-02-24 03:13:50

2

请不要使用内置ID作为ID。

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

你得到KeyError你第一次拨打:

d[i].append(number) 

这是因为在d没有钥匙i。而不是解决了这个代码,让我们来看看使用enumerate()zip(),这也许是更“Python化”:

>>> 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()函数返回一个新的字典对象,在。

+0

谢谢!你救了我的一天! – user2103666 2013-02-24 03:14:21

+0

@ user2103666:高兴帮忙:) – Johnsyweb 2013-02-24 06:45:09