Инвертирование словаря в python без использования setdefault - PullRequest
0 голосов
/ 03 мая 2020

Проблема: с учетом словаря (каждый ключ имеет список в качестве значения!) Инвертировать его без использования setdefault! Вы можете предположить, что словарь не пуст и каждое значение представлено в виде списка.

Я знаю, что здесь уже есть ответ в stackoverflow! но они использовали setdefault и другие операции импорта ...

пример:

orig_dict:

{"yossi":["harry potter", "lilo and stich"], "adam":["harry potter","catch-22"]} 

inverted_dict:

{"harry potter":["adam","Bob"], "lilo and stich":["Bob"], "catch-22":["adam"]}

у меня пока есть этот код ...

def invert_dol(d):
    return dict((v, k) for k in d for v in d[k])

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

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

orig_dict = {'yossi': ['harry potter', 'lilo and stich'], 'adam': ['harry potter', 'catch-22']}

def invert_dol(d):
    inverted_dict = {movie: [name for name, list_ in d.items() if movie in list_] \
        for k, v in d.items() for movie in v}
    return inverted_dict

При вызове этой функции, передавая orig_dict в качестве параметра, выдается следующее:

{'harry potter': ['yossi', 'adam'], 'lilo and stich': ['yossi'], 'catch-22': ['adam']}

(Обратите внимание, что нет "bob", потому что в orig_dict не было ни одного)

0 голосов
/ 03 мая 2020

Откуда взялся 'Bob '?

>>> {
    fave: [name for name in orig_dict.keys() if fave in orig_dict[name]] 
    for faves in orig_dict.values() for fave in faves
}
{'harry potter': ['yossi', 'adam'], 'lilo and stich': ['yossi'], 'catch-22': ['adam']}
0 голосов
/ 03 мая 2020

    orig_dict = {"yossi":["harry potter", "lilo and stich"], "adam":["harry potter","catch-22"]}


    inverted_dict = dict()
    for k, v in orig_dict.items():
        for item in v:
            if item not in inverted_dict:
                inverted_dict[item]=[k]
            else:
                inverted_dict[item].append(k)   

    print(inverted_dict)

# {'harry potter': ['yossi', 'adam'], 'lilo and stich': ['yossi'], 'catch-22': ['adam']}
...