【问题标题】:Dictionary update overwrites duplicate keys字典更新覆盖重复键
【发布时间】:2018-10-19 00:56:44
【问题描述】:

我有一个包含 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']....} 

【问题讨论】:

    标签: list dictionary python-3.6 updates


    【解决方案1】:

    简答:Python 中的字典对象中没有重复键。

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

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

    虽然这样做会抵消查找速度和易用性的任何好处。

    编辑:blhsing 也有一个很好的例子,说明如何通过减少初始查找时间来重构数据,尽管您仍然需要遍历数据以获得所需的记录。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-02-24
        • 2023-01-19
        • 1970-01-01
        • 2019-05-04
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多