字典更新覆盖重复键
Dictionary update overwrites duplicate keys
我有一个 table 有 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']....}
字典不允许在 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']], ...}
简短回答:Python 中的字典对象中没有重复的键。
但是,如果您要重组数据并获取该键并将其放入嵌套在列表中的字典中,您可能会有重复的 ID。例如:
[
{
"id": "CA10376036",
"data: ['AE', 'X']
},
{
"id": "CA10376036",
"data: ['V', 'D']
},
]
虽然这样做会抵消查找速度和简便性的任何好处。
编辑:blhsing 也有一个很好的例子,说明如何通过减少初始查找时间来重组数据,尽管您仍然必须遍历数据才能获得所需的记录。
我有一个 table 有 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']....}
字典不允许在 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']], ...}
简短回答:Python 中的字典对象中没有重复的键。
但是,如果您要重组数据并获取该键并将其放入嵌套在列表中的字典中,您可能会有重复的 ID。例如:
[
{
"id": "CA10376036",
"data: ['AE', 'X']
},
{
"id": "CA10376036",
"data: ['V', 'D']
},
]
虽然这样做会抵消查找速度和简便性的任何好处。
编辑:blhsing 也有一个很好的例子,说明如何通过减少初始查找时间来重组数据,尽管您仍然必须遍历数据才能获得所需的记录。