Вопрос-Ответ

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 = []

def createDictionaryModified(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, который будет автоматически сохранять дублирующиеся значения в списках под одним и тем же ключом:

class Dictlist(dict):
def __setitem__(self, key, value):
try:
self[key]
except KeyError:
super(Dictlist, self).__setitem__(key, [])
self[key].append(value)

Пример вывода:

>>> d = dictlist.Dictlist()
>>> d['test'] = 1
>>> d['test'] = 2
>>> d['test'] = 3
>>> d
{'test': [1, 2, 3]}
>>> d['other'] = 100
>>> d
{'test': [1, 2, 3], 'other': [100]}
Ответ 3

Вместо того, чтобы использовать 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 с дубликатами ключей для определения! Вместо этого вы можете использовать один ключ и, в качестве значения, список элементов, у которых был этот ключ.

Итак, вы можете выполнить следующие действия:


  1. Посмотрите, находится ли ключ текущего элемента (из вашего начального набора) в конечном dict . Если это так, перейдите к шагу 3

  2. Обновить dict с помощью key

  3. Добавьте новое значение в список dict[ключ]

  4. Повторить [1-3]

python dictionary