Словари наборов Python

у меня есть словарь

boxes {
    'box 1' : 'apples',
    'box 2' : 'mangoes',
    'box 3' : 'oranges',
    'box 4' : 'mangoes'
}

Мне нужно перегруппировать этот словарь как

fruits {
    'apples' :  {'box 1' }, 
    'mangoes' : {'box 2', 'box 4'},
    'oranges' : {'box 3'}
}

Я попытался:

fruits = {}
for k, v in boxes.items():
    if (v in fruits):
        fruits[v].add(k)
    else:
        fruits[v] = set()
        fruits[v].add(k)

Я получаю эту ошибку: TypeError: unhashable type: 'set', и многие другие попытки также не работают. Пожалуйста, направляйте! Спасибо

То, что вы опубликовали, работает, несмотря на отсутствие = в первых фрагментах. Эта ошибка типа предполагает, что вы пытались использовать набор как ключ, а не ценность.

jonrsharpe 09.05.2022 11:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это хороший случай для использования setdefault следующим образом:

boxes = {
    'box 1' : 'apples',
    'box 2' : 'mangoes',
    'box 3' : 'oranges',
    'box 4' : 'mangoes'
}

fruits = dict()

for k, v in boxes.items():
    fruits.setdefault(v, set()).add(k)

print(fruits)

Выход:

{'apples': {'box 1'}, 'mangoes': {'box 2', 'box 4'}, 'oranges': {'box 3'}}

К сожалению, по-прежнему возникает та же ошибка fruit.setdefault(v, set()).add(k) TypeError: unhashable type: 'set'

AB Code 09.05.2022 12:02

@ABCode Вы пытались запустить код, показанный в моем ответе?

Lancelot du Lac 09.05.2022 12:10

да, скопипастил то же самое. используя spyder 5, Python 3.7.9

AB Code 09.05.2022 12:20

@ABCode Создайте скрипт с содержимым этого ответа и запустите его из командной строки. Я подозреваю что-то странное со Spyder, но я им не пользуюсь. Показанный код — это чистый Python. Я не использую устаревшую версию Python, поэтому не могу сказать, проблема ли это в вашей версии, но я в этом сомневаюсь.

Lancelot du Lac 09.05.2022 12:30

Я только что установил Spyder 5.3.0 и запустил этот код без проблем. Проблема, которую вы видите, может возникнуть Только, если переменная в является набором

Lancelot du Lac 09.05.2022 12:39

– Ланселот дю Лак СПАСИБО !! Это сработало. Я запускал через терминал. Перезапущенный Spyder, и он тоже побежал туда! Странно, но счастливо.

AB Code 09.05.2022 12:47

Другие вопросы по теме