Python: преобразуйте список кортежей (отношение 1 ко многим) в словарь

#python #list #dictionary

Вопрос:

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

 words = [('food', 'apple'), ('food', 'banana'), ('food', 'pear'),
         ('animal', 'monkey'), ('animal', 'gorilla'), ('animal', 'horse'), 
         ('country', 'UK'), ('country', 'US'), ('country', 'JP')]

dict1 ={}
for k,v in words: 
        if k in dict1:
            dict1[k].append(v)
        else:
            dict1[k]=[v]
        
print (dict1)

 

Выход:

 {'food': ['apple', 'banana', 'pear'], 
'animal': ['monkey', 'gorilla', 'horse'],
 'country': ['UK', 'US', 'JP']}
 

Желаемый результат:

 {'food': {'apple', 'banana', 'pear'}, 
'animal': {'monkey', 'gorilla', 'horse'}, 
'country': {'UK', 'US', 'JP'}}
 

Комментарии:

1. Что означает dictionary-dictionary формат? Желаемый результат — это не вложенные словари. Это просто наборы внутри словаря.

2. {'food': {'apple', 'banana', 'pear'}, 'animal': {'monkey', 'gorilla', 'horse'}, 'country': {'UK', 'US', 'JP'}} это не словарь со словарями… это set объекты. Так что именно так, как вы сделали выше, просто используйте a set вместо a list . Но зачем тебе это нужно?

3. @juanpa.arrivillaga Обратите внимание, что это add вместо append «хотя» при использовании наборов.

4. привет, спасибо за разъяснение, что это набор внутри словаря. думаю, теперь я это понимаю.

Ответ №1:

Чтобы создать словарь с заданными значениями, которые вы показываете в качестве желаемых выходных данных, вы можете выполнить следующие действия, используя dict.setdefault :

 dict1 = {}
for k, v in words: 
    dict1.setdefault(k, set()).add(v)