Как создать словарь, значения которого являются списками - PullRequest
0 голосов
/ 06 июля 2018

Я прочитал код в книге «Подумай о питоне». Этот код застревает на inverse[val].[key] с ошибкой:

Объект 'str' не имеет атрибута 'append' '

Что имеет смысл, поскольку inverse[val] содержит строковый объект. Здесь d - входной словарь.

def invert_dict(d):
    inverse = dict()
    for key in d:
        val = d[key]
        if val not in inverse:
            inverse[val] = [key]
        else:
            inverse[val].append(key)
    return inverse

Словарь ввода {'a': 1, 'p': 1, 'r': 2, 't': 1, 'o': 1}

Ожидаемый результат - {1: ['a', 'p', 't', 'o'], 2: ['r']}

Как мне реализовать это, изменив данный блок кода?

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

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

def invert_dict(d):
    values = set(d.values())
    inverse = dict((v,[k for k in d.keys() if d[k]==v]) for v in values)
    return inverse


inv = invert_dict({'a': 1, 'p': 1, 'r': 2, 't': 1, 'o': 1})
print(inv)

Выход:

{1: ['a', 'p', 't', 'o'], 2: ['r']}
0 голосов
/ 06 июля 2018

попробуйте это:

def invert_dict(data):
    inverse = {}
    for key, value in data.items():
        if value not in inverse:
            inverse[value] = [key]
        else:
            inverse[value].append(key)
    return inverse
0 голосов
/ 06 июля 2018

Однострочник, использующий уменьшение :

inverted_dict = reduce((lambda inverted_dict, key: inverted_dict.setdefault(dd[key], []).append(key) or inverted_dict), d, {})

Выход:

{1: ['t', 'o', 'p', 'a'], 2: ['r']}
0 голосов
/ 06 июля 2018

Вы можете использовать collections.defaultdict для создания словаря списков.Затем добавьте значения словаря во время итерации входного словаря.

from collections import defaultdict

d_in = {'a': 1, 'p': 1, 'r': 2, 't': 1, 'o': 1}

d_out = defaultdict(list)

for k, v in d_in.items():
    d_out[v].append(k)

print(d_out)

defaultdict(<class 'list'>, {1: ['a', 'p', 't', 'o'], 2: ['r']})

Ваш код может быть улучшен путем итерации ключей и значений одновременно с помощью dict.items вместо итерации ключей и извлечения значения вручную.Кроме того, ваш отступ неверен.После решения этих проблем:

def invert_dict(d):
    inverse = dict()
    for key, val in d.items():
        if val not in inverse:
            inverse[val] = [key]
        else:
            inverse[val].append(key)
    return inverse
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...