2012-01-11 2 views
1

У меня есть список объектов (кластеров), и каждый объект имеет атрибут vertices, который представляет собой список чисел. Я хочу построить словарь (используя один лайнер), так что ключ является числом вершин, а значение является индексом соответствующего кластера в фактическом списке.Построить словарь, объединяющий несколько списков

Ex:

clusters[0].vertices = [1,2] 
clusters[1].vertices = [3,4] 

Ожидаемый результат:

{1:0,2:0,3:1,4:1} 

я придумал следующее:

dict(reduce(lambda x,y:x.extend(y) or x, [ 
    dict(zip(vertices, [index]*len(vertices))).items() 
    for index,vertices in enumerate([i.vertices for i in clusters])])) 

Он работает ... но есть лучший способ сделать это?

Также прокомментируйте эффективность вышеуказанного фрагмента кода.

PS: Вершинные списки не пересекаются.

+6

Возможно, вы имели в виду ожидаемый результат: {1: 0, 2: 0, 3: 1, ** 4: 1 **}? – kasyc

+0

Извините ... обновил его :) – Graddy

+0

Я предлагаю вам написать функцию, чтобы сделать это, а затем ваш однострочный вызов является вызовом функции. [Показатели удобочитаемости] (http://www.python.org/dev/peps/pep-0020/) – MattH

ответ

5

Это довольно простое решение, используя вложенную for:

dict((vert, i) for (i, cl) in enumerate(clusters) for vert in cl.vertices) 

Это также является более эффективным, чем версия в этом вопросе, так как он не строит много промежуточных списков во время сбора данных для dict.

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