在Python中从二维列表创建一个字典

时间:2016-07-14 17:08:31

标签: python list dictionary

我面临着从列表和列表列表中创建字典的麻烦。这是一个例子:

a = ['a','b','c','d']
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]]

我希望输出使用列表 a 的元素和列表 b 的第三个元素,例如这个输出:

a = {'a': 0, 'b': 1, 'c': 0, 'd': 1]

两个列表都有相同的长度,所以我尝试了类似的东西:

c = dict(zip(a,b))

但在这种情况下,我无法选择b的第三个元素。

在我的实际情况中,我有数百万的数据,所以我需要一种快速而简单的方法来做到这一点,并且从b创建临时列表可能不是最佳解决方案。

由于

4 个答案:

答案 0 :(得分:2)

你可以这样做:

dict(zip(a, (x[-1] for x in b)))  # Maybe x[2] if some of the sublists have more than 3 elements.

如果您使用的是python2.x,则可能需要使用itertools.izipfuture_builtins.zip

答案 1 :(得分:1)

或者,在理解中使用字典:

a = ['a','b','c','d']
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]]

c = {k: v[-1] for k, v in zip(a, b)}

参见startswith Dict理解

答案 2 :(得分:0)

我试过这个,它似乎有效:

>>> a = ['a','b','c','d']
>>> b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]]
>>> c = dict(zip(a, [d[2] for d in b]))
>>> c
{'a': 0, 'c': 0, 'b': 1, 'd': 1}

答案 3 :(得分:0)

您可以在itemgetter模块中使用operator 2 表示 b 子列表中的索引。

from operator import itemgetter
a = ['a','b','c','d']
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]]

c = dict(zip(a, map(itemgetter(2), b)))

由于你有很多元素,因此itertools可能会对记忆有所帮助:

from operator import itemgetter
from itertools import izip, imap

a = ['a','b','c','d']
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]]

c = dict(izip(a, imap(itemgetter(2), b)))

这些解决方案将有助于利用底层C模块的性能优势。