List 字典更新覆盖重复的键

List 字典更新覆盖重复的键,list,dictionary,python-3.6,updates,List,Dictionary,Python 3.6,Updates,我有一个表,其中有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_va

我有一个表,其中有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
的值相同(理论上可能存在重复),则条目会被覆盖。因此,如果我想添加两个条目:
'CA10376036':['AE',X']
'CA10376036':['V',D']
,第一个条目会被覆盖,我只会得到
'CA10376036':['V',D']
。我怎样才能在不覆盖重复键的情况下添加到字典中,从而得到这样的结果

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

Python中不允许dict具有重复的键。您可以使用
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\u zone\u dict
将变成:

{'CA10376036': [['AE', 'X'], ['V', 'D']], 'CA9194089': ['D', 'X'], ...}
{'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\u zone\u dict
将变成:

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

简短回答:在Python中,字典对象中不可能有重复的键

但是,如果要重新构造数据,并获取该键并将其放入嵌套在列表中的字典中,则可能会有重复的ID。例:

[
    {
        "id": "CA10376036",
        "data: ['AE', 'X']
    },
    {
        "id": "CA10376036",
        "data: ['V', 'D']
    },
]
但这样做会抵消查找速度和方便性带来的任何好处

编辑:blhsing还提供了一个很好的例子,说明了如何在减少初始查找时间的情况下重新构造数据,尽管您仍然需要遍历数据以获得所需的记录