2016-07-14 3 views
0

У меня возникли проблемы с созданием словаря из списка и списка списков. Вот пример:Создайте словарь из двумерного списка в Python

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

Я хочу вывод, используя элементы списка а и третий элемент списка б, как этот выход:

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

Оба списка имеют такую ​​же длину, поэтому я попробовал что-то вроде:

c = dict(zip(a,b)) 

Но в этом случае я не могу выбрать третий элемент b.

В моем реальном случае у меня есть миллионы данных, поэтому мне нужен быстрый и простой способ сделать это, и создать временный список из b не может быть оптимальным решением.

Благодаря

ответ

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

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} 
1

Или, используя словарь в comp rehension:

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

См PEP274 Dict постижения

0

Вы можете использовать itemgetter внутри operator модуля. Где представляет собой индекс в пределах 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 для выигрыша в производительности.

Смежные вопросы