#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. ой, извините за это. когда я начал редактировать свой ответ, я не видел редактирования.