2017-01-05 3 views
-2

У меня есть два списка в Python следующей структуры:Создать словарь из списков?

list1 = [[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x5,y5],[x6,y6],[x7,y7],[x8,y8]] 
list2 = [1,1,2,2,3,3,3,4] 

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

{1: [[x1,y1], [x2,y2]], 
2: [[x3,y3], [x4,y4]], 
3: [[x5,y5], [x6,y6], [x7,y7]], 
4: [x8,y8]} 

Каков наиболее эффективный способ сделать это в python?

Я использовал команду zip:

newlist = zip(list2, list1) 

Но теперь его мне не ясно, как превратить это в словаре я хочу.

+2

Прежде чем обратиться к «наиболее эффективным способом», после того, что вы сделали. –

+1

Как в стороне, было бы полезно опубликовать действительный python для этого примера. Когда я скопировал его для работы над решением, я понял, что мне нужно пройти и преобразовать все эти значения в строки. Поскольку вы не показали, что вы пробовали сами, я, вероятно, не буду. – roganjosh

+0

Сначала сделайте базовый цикл, затем посмотрите, как сделать его более эффективным. – sabbahillel

ответ

0

Если вы не возражаете против использования внешних библиотек, то я бы рекомендовал iteration_utilities.groupedby (раскрытие информации: Я автор этой библиотеки):

>>> list1= [['x1','y1'],['x2','y2'],['x3','y3'],['x4','y4'],['x5','y5'],['x6','y6'],['x7','y7'],['x8','y8']] 
>>> list2 = [1,1,2,2,3,3,3,4] 

>>> from iteration_utilities import groupedby 
>>> from operator import itemgetter 

>>> groupedby(zip(list2, list1), key=itemgetter(0), keep=itemgetter(1)) 
{1: [['x1', 'y1'], ['x2', 'y2']], 
2: [['x3', 'y3'], ['x4', 'y4']], 
3: [['x5', 'y5'], ['x6', 'y6'], ['x7', 'y7']], 
4: [['x8', 'y8']]} 

Под капотом это как с помощью collections.defaultdict, он просто экономит вам вручную итерации.


Если list2 является «отсортированный» вы можете легко использовать itertools.groupby:

>>> from itertools import groupby 

>>> {key: [i[1] for i in values] for key, values in groupby(zip(list2, list1), itemgetter(0))} 
{1: [['x1', 'y1'], ['x2', 'y2']], 
2: [['x3', 'y3'], ['x4', 'y4']], 
3: [['x5', 'y5'], ['x6', 'y6'], ['x7', 'y7']], 
4: [['x8', 'y8']]} 
0

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

vals = [["x1","y1"],["x2","y2"],["x3","y3"],["x4","y4"],["x5","y5"],["x6","y6"],["x7","y7"],["x8","y8"]] 
keys = [1,1,2,2,3,3,3,4] 

result = {} 
for k,v in zip(keys,vals): 
    result[k] = result.get(k, []) + [v] 

# output: {1: [['x1', 'y1'], ['x2', 'y2']], 2: [['x3', 'y3'], ['x4', 'y4']], 3: [['x5', 'y5'], ['x6', 'y6'], ['x7', 'y7']], 4: [['x8', 'y8']]} 
+0

Другое, возможно, больше эффективный вариант для внутреннего цикла: result.setdefault (k, []). append (v) – camomilk

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