How can one make a dictionary with duplicate keys in Python?
Как можно создать словарь с дубликатами ключей в Python?
У меня есть текстовый файл, который содержит дубликаты регистрационных номеров автомобилей с разными значениями, например, так:
EDF768, Bill Meyer, 2456, Vet_Parking TY5678, Jane Miller, 8987, AgHort_Parking GEF123, Jill Black, 3456, Creche_Parking ABC234, Fred Greenside, 2345, AgHort_Parking GH7682, Clara Hill, 7689, AgHort_Parking JU9807, Jacky Blair, 7867, Vet_Parking KLOI98, Martha Miller, 4563, Vet_Parking ADF645, Cloe Freckle, 6789, Vet_Parking DF7800, Jacko Frizzle, 4532, Creche_Parking WER546, Olga Grey, 9898, Creche_Parking HUY768, Wilbur Matty, 8912, Creche_Parking EDF768, Jenny Meyer, 9987, Vet_Parking TY5678, Jo King, 8987, AgHort_Parking JU9807, Mike Green, 3212, Vet_Parking
Я хочу создать словарь из этих данных, который использует регистрационные номера (первый столбец) в качестве ключей и данные из остальной части строки в качестве значений.
Я написал этот код:
data_dict = {} data_list = []
defcreateDictionaryModified(filename): path = "C:\Users\user\Desktop" basename = "ParkingData_Part3.txt" filename = path + "//" + basename file = open(filename) contents = file.read() print(contents,"\n") data_list = [lines.split(",") for lines in contents.split("\n")] for line in data_list: regNumber = line[0] name = line[1] phoneExtn = line[2] carpark = line[3].strip() details = (name,phoneExtn,carpark) data_dict[regNumber] = details print(data_dict,"\n") print(data_dict.items(),"\n") print(data_dict.values())
Проблема в том, что файл данных содержит повторяющиеся значения для регистрационных номеров. Когда я пытаюсь сохранить их в том же словаре с помощью data_dict[regNumber] = details, старое значение перезаписывается.
Как мне создать словарь с дубликатами ключей?
Иногда люди хотят "объединить" несколько существующих словарей, просто поместив все элементы в один dict, и удивляются или раздражаются, что дублирующиеся ключи перезаписываются. Смотрите связанный вопрос Как объединить dicts, собирая значения из совпадающих ключей? чтобы разобраться с этой проблемой.
Переведено автоматически
Ответ 1
Словари Python не поддерживают дубликаты ключей. Один из способов - хранить списки или наборы внутри словаря.
Один из простых способов добиться этого - использовать defaultdict:
from collections import defaultdict
data_dict = defaultdict(list)
Все, что вам нужно сделать, это заменить
data_dict[regNumber] = details
с помощью
data_dict[regNumber].append(details)
и вы получите словарь списков.
Ответ 2
Вы можете изменить поведение встроенных типов в Python. Для вашего случая действительно легко создать подкласс dict, который будет автоматически сохранять дублирующиеся значения в списках под одним и тем же ключом:
Вместо того, чтобы использовать defaultdict или возиться с тестами членства или ручной обработкой исключений, используйте setdefault метод для добавления новых пустых списков в словарь, когда они необходимы:
results = {} # use a normal dictionary for our output for k, v in some_data: # the keys may be duplicates results.setdefault(k, []).append(v) # magic happens here!
setdefault проверяет, есть ли первый аргумент (ключ) уже в словаре. Если ничего не находит, он присваивает второй аргумент (значение по умолчанию, в данном случае пустой список) в качестве нового значения для ключа. Если ключ действительно существует, ничего особенного не делается (по умолчанию он остается неиспользуемым). Однако в любом случае возвращается значение (старое или новое), поэтому мы можем безоговорочно вызвать append для него (зная, что это всегда должен быть список).
Ответ 4
У вас не может быть dict с дубликатами ключей для определения! Вместо этого вы можете использовать один ключ и, в качестве значения, список элементов, у которых был этот ключ.
Итак, вы можете выполнить следующие действия:
Посмотрите, находится ли ключ текущего элемента (из вашего начального набора) в конечном dict . Если это так, перейдите к шагу 3