Обновление словаря перезаписывает дубликаты ключей - PullRequest
0 голосов
/ 19 октября 2018

У меня есть таблица с 6982 записями, которые я читаю, чтобы составить словарь.Я использовал литерал для создания словаря

fld_zone_dict = dict()
fields = ['uniqueid', 'FLD_ZONE', 'FLD_ZONE_1']
...
for row in cursor:
    uid = row[0]
    old_zone_value = row[1]
    new_zone_value = row[2]
    fld_zone_dict[uid] = [old_zone_value, new_zone_value]

Однако я заметил, что при использовании этого метода, если uid имеет то же значение, что и предыдущий uid (теоретически, может быть дубликат), записьпереписываетсяИтак, если бы у меня было 2 записи, которые я хотел бы добавить: 'CA10376036': ['AE', 'X'] и 'CA10376036': ['V', 'D'], первая перезаписывается, и я получаю только 'CA10376036': ['V', 'D'].Как я могу добавить в свой словарь, не перезаписывая дубликаты ключей, чтобы получить что-то вроде этого?

fld_zone_dict = {'CA10376036': ['AE', 'X'], 'CA9194089':['D', 'X'],'CA10376036': ['V', 'D']....} 

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Краткий ответ: в Python нет возможности иметь дубликаты ключей в объекте словаря.

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

[
    {
        "id": "CA10376036",
        "data: ['AE', 'X']
    },
    {
        "id": "CA10376036",
        "data: ['V', 'D']
    },
]

Выполнение этого, однако, сведет на нет любые преимущества скорости и простоты поиска.

edit: blhsing также имеет хороший пример того, как реструктурировать данные с уменьшенным начальным временем поиска,хотя вам все равно придется перебирать данные, чтобы получить нужную запись.

0 голосов
/ 19 октября 2018

Dicts не разрешается иметь дубликаты ключей в Python.Вместо этого вы можете использовать метод dict.setdefault для преобразования существующих ключей в список:

for row in cursor:
    uid = row[0]
    old_zone_value = row[1]
    new_zone_value = row[2]
    fld_zone_dict.setdefault(uid, []).append([old_zone_value, new_zone_value])

, так что fld_zone_dict будет выглядеть так:

{'CA10376036': [['AE', 'X'], ['V', 'D']], 'CA9194089': ['D', 'X'], ...}

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

for k, v in fld_zone_dict.items():
    fld_zone_dict[k] = [v]
for row in cursor:
    uid = row[0]
    old_zone_value = row[1]
    new_zone_value = row[2]
    fld_zone_dict[uid].append([old_zone_value, new_zone_value])

, чтобы fld_zone_dict получилось как:

{'CA10376036': [['AE', 'X'], ['V', 'D']], 'CA9194089': [['D', 'X']], ...}
...