字典更新会覆盖重复的键

时间:2018-10-19 00:56:45

标签: 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_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 :(得分:1)

简短的回答:在Python的字典对象中无法实现重复的键。

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

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

尽管这样做会否定查找速度和简便性的任何好处。

编辑:blhsing还提供了一个很好的示例,说明了如何以减少的初始查找时间来重组数据,尽管您仍然必须遍历数据以获得所需的记录。

答案 1 :(得分:0)

在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']], ...}