Доступ к словарю, созданному внутри словарного понимания - PullRequest
4 голосов
/ 03 ноября 2011

У меня есть словарь чисел для списков чисел, таких как:

a = {1: [2,3,4], 2: [1,4]}

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

Это будет что-то вроде:

b = {element: [key] для ключа в a.keys () для элемента в [key]}

, что дает мне, конечно:

b = {1: [2], 2: [1], 3: [1], 4: [2]}

вместо

b ={1: [2], 2: [1], 3: [1], 4: [1,2]}

, поскольку индекс перезаписывается.поэтому мне нужно сделать что-то вроде:

b = { element : [key] + self[element] for key in a.keys() for element in a[key]}

или

b = { element +: key for key in a.keys() for element in a[key]}

, но в рабочем режиме.

Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 03 ноября 2011

Создать словарь легко, используя defaultdict и два цикла.

from collections import defaultdict
a = { 1: [2,3,4] , 2: [1,4] }
b = defaultdict(list)
for key, value in a.iteritems():
    for elem in value:
        b[elem].append(key)
2 голосов
/ 03 ноября 2011

Возможно все:

>>> a = { 1: [2,3,4] , 2: [1,4] }
>>> d={}
>>> for k, v in sum(map(lambda x: zip(x[1], [x[0]]*len(x[1])), a.items()), []):
...   d.setdefault(k, []).append(v)
...
>>> d
{1: [2], 2: [1], 3: [1], 4: [1, 2]}
>>>
2 голосов
/ 03 ноября 2011

я предполагаю, что это для какой-то формы отображения:

from itertools import chain
def makeMap(d):
    nodes = set([x for x in chain.from_iterable(d.values())])
    return dict([[x, [y for y in d.keys() if x in d[y]]] for x in nodes ])

этот код сделает это за вас:)


EDIT:

и вот (массивный) один слой, я бы не советовал помещать это в код, так как он не читается.

def makeMap(d):
    return dict([[x, [y for y in d.keys() if x in d[y]]]
                 for x in set([x for x in chain.from_iterable(d.values())])
                 ])

шаги:
1. сделать набор всех возможных значений узла
2. найти все значения узла в значениях словаря, если затем поместить ключ, в котором он был найден, в отображенный список.

...