0

我被这个简单的任务困住了。我有一个列表列表,我需要将其转换为字典,但到目前为止没有任何成功。

我用下面的代码试过了,但它给了我 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]}

任何帮助表示赞赏,在此先感谢!

4

2 回答 2

4

enumerate顺便说一句,您可以通过使用andzip函数非常简单地做到这一点。

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 中的列表,或zipPython 3 中的对象,可以将其转换为等效列表。

    [(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)}
    
于 2013-02-24T03:11:35.167 回答
2

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

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

KeyError第一次打电话:

d[i].append(number)

这是因为 没有键id让我们看看使用enumerate()and 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)]

这会将列表解压缩zip(),这会将三个较小的列表“压缩”在一起。

>>> enumerate(zip(*lst)

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

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

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

于 2013-02-24T03:11:13.123 回答