Mam słownik liczb do list takich jak:

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

Chcę stworzyć nowy słownik ze zrozumieniem na podstawie tego, gdzie każdy element z każdej listy byłby połączony z kluczem do tej listy.

To byłoby coś takiego:

b = {element: [klawisz] dla klawisza w A.keys () dla elementu w [Klucz]}

To oczywiście daje mi:

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

Zamiast

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

Ponieważ indeks zostanie nadpisany. Muszę więc zrobić coś takiego:

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

Lub

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

Ale w modzie roboczej.

Czy to możliwe?

4
user246100 3 listopad 2011, 03:02

3 odpowiedzi

Najlepsza odpowiedź

Zakładam, że jest to dla jakiejś formy mapowania:

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

Ten kod zrobi to dla Ciebie :)


EDYTOWAĆ:

I heres The (masywny) jeden wkładka, nie polecam jednak wprowadzenia tego w kodzie, ponieważ jest to nieczytelne.

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())])
                 ])

Kroki:
. 1. Zrób zestaw wszystkich możliwych wartości węzła
2. Znajdź wszystkie wartości węzła w wartościach słownika, jeśli następnie umieść klucz, został znaleziony w mapowany do listy.

2
Serdalis 2 listopad 2011, 23:34

Łatwo zbudować słownik za pomocą defaultdict i dwie pętle.

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)
3
Alasdair 2 listopad 2011, 23:22

Wszystko jest możliwe:

>>> 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
Lachezar 2 listopad 2011, 23:37