Как создать словарь, который будет иметь общие ключи

#python #python-3.x #dictionary #python-3.7 #python-3.8

#python #python-3.x #словарь #python-3.7 #python-3.8

Вопрос:

Я пытаюсь создать словарь, используя ключи и значения

 keys = [1,2,3,4,5,1,1,2,2,3,4,4,5,6,7,7,8,9]
 

и значения.

 values = ['a', 'b' , 'c' ,'d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
 

используя функцию zip или используя цикл for.

 dict1 = dict(zip(keys, values))
print(dict1)
 

Результат таков.

 {1: 'g', 2: 'i', 3: 'j', 4: 'l', 5: 'm', 6: 'n', 7: 'p', 8: 'q', 9: 'r'}
 

Но dict игнорирует значения для общих ключей. Например, он игнорирует 1: ‘a’ и многое другое.

Пожалуйста, скажите мне, как с этим справиться.

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

1. Это звучит как проблема XY. Как вы думаете, что вы собираетесь делать с a dict , если бы вы могли получить его так, как вам нравится?

2. Пожалуйста, ознакомьтесь с тем, что такое a dict — в качестве аналогии — массив не может иметь повторяющихся «индексов»

Ответ №1:

Dict не может иметь несколько одинаковых ключей. Но у вас может быть несколько одинаковых значений.

Например:

 a = {
    1: "a",
    1: "b"
}
print(a)  # {1: 'b'}
b = {
    "a": 1,
    "b": 1
}
print(b)  # {'a': 1, 'b': 1}
 

Почему

Ключи должны быть уникальными, потому что вы получаете доступ к значениям с my_dict[key] помощью . Если my_dict[key] указать несколько значений, какое из них вы выберете?

Альтернатива

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

 keys = [1,2,3,4,5,1,1,2,2,3,4,4,5,6,7,7,8,9]
values = ['a', 'b' , 'c' ,'d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']

dict1 = dict()
for key, value in zip(keys, values):
    if key in dict1:
        dict1[key].append(value)
    else:
        dict1[key] = [value]

print(dict1)
# {1: ['a', 'f', 'g'], 2: ['b', 'h', 'i'], 3: ['c', 'j'], 4: ['d', 'k', 'l'], 5: ['e']}
 

С помощью collections.defaultdict

 from collections import defaultdict

keys = [1,2,3,4,5,1,1,2,2,3,4,4,5,6,7,7,8,9]
values = ['a', 'b' , 'c' ,'d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']

dict1 = defaultdict(list)
for key, value in zip(keys, values):
    dict1[key].append(value)

print(dict(dict1))
# {1: ['a', 'f', 'g'], 2: ['b', 'h', 'i'], 3: ['c', 'j'], 4: ['d', 'k', 'l'], 5: ['e']}
 

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

1. Вы также можете использовать dict1.setdefault(key, []).append(value) 🙂

2. @AbdulNiyasPM вы можете отредактировать мой ответ, чтобы добавить свое предложение, если хотите

Ответ №2:

В идеале это должно быть комментарием к ответу Дориана выше. Однако у меня недостаточно очков репутации для комментариев. Просто хотел добавить, что я предпочитаю использовать defaultdict() вместо dict(), чтобы избежать необходимости проверять, используется ли ключ уже.

 from collections import defaultdict 

keys = [1,2,3,4,5,1,1,2,2,3,4,4,5,6,7,7,8,9]
values = ['a', 'b' , 'c' ,'d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']

dict1 = defaultdict(lambda:[])
for key, value in zip(keys, values):
    dict1[key].append(value)
    
print(dict1)
# {1: ['a', 'f', 'g'], 2: ['b', 'h', 'i'], 3: ['c', 'j'], 4: ['d', 'k', 'l'], 5: ['e']}
 

Если вы хотите узнать больше об использовании defaultdict(), вот хорошая ссылка https://www.accelebrate.com/blog/using-defaultdict-python

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

1. Смотрите мое редактирование 20 минут назад 🙂 Вместо defaultdict(lambda:[]) этого вы должны использовать defaultdict(list) .

2. ой, извините за это. когда я начал редактировать свой ответ, я не видел редактирования.