我面临着从列表和列表列表中创建字典的麻烦。这是一个例子:
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创建临时列表可能不是最佳解决方案。
由于
答案 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.izip
或future_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模块的性能优势。