如何从字典中删除重复项?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

我有以下Python 2.7字典数据结构:

{112762853378: 
   {'dst':['10 .121.4.136'], 
    'src':['1.2.3.4'], 
    '别名':['www.example.com']
   },
 112762853385: 
   {'dst':['10 .121.4.136'], 
    'src':['1.2.3.4'], 
    '别名':['www.example.com']
   },
 112760496444: 
   {'dst':['10 .121.4.136'], 
    'src':['1.2.3.4']
   },
 112760496502: 
   {'dst':['10 .122.195.34'], 
    'src':['4.3.2.1']
   },
 112765083670: ...
}

字典键将永远是唯一的。Dst,src和别名可以是重复的。所有记录将始终有一个dst和src,但不是每个记录都必须有一个别名,如第三条记录中所示。

在样本数据中,前两个记录中的任何一个都将被删除(对我来说哪个并不重要)。第三条记录会被认为是唯一的,因为虽然dst和src是相同的,但它是缺少别名的。

我该如何才能做到呢?我对Python的有限理解将数据结构解释为一个字典,其中存储在字典中的值......字典的字典,这是正确的吗?

提问于
用户回答回答于

如果该值不在结果字典中,你可以查看字典中的每个项目,并将它们添加到结果字典中:

input_raw = {112762853378: 
   {'dst': ['10.121.4.136'], 
    'src': ['1.2.3.4'], 
    'alias': ['www.example.com']
   },
 112762853385: 
   {'dst': ['10.121.4.136'], 
    'src': ['1.2.3.4'], 
    'alias': ['www.example.com']
   },
 112760496444: 
   {'dst': ['10.121.4.136'], 
    'src': ['1.2.3.4']
   },
 112760496502: 
   {'dst': ['10.122.195.34'], 
    'src': ['4.3.2.1']
   }
}

result = {}

for key,value in input_raw.items():
    if value not in result.values():
        result[key] = value

print result
用户回答回答于

一种简单的方法是使用每个内部字典中字符串数据的串联作为关键字来创建反向字典:

>>> import collections
>>> reverse_d = collections.defaultdict(list)
>>> for key, inner_d in d.iteritems():
...     key_str = ''.join(inner_d[k][0] for k in ['dst', 'src', 'alias'] if k in inner_d)
...     reverse_d[key_str].append(key)
... 
>>> duplicates = [keys for key_str, keys in reverse_d.iteritems() if len(keys) > 1]
>>> duplicates
[[112762853385, 112762853378]]

你可以使用一个常规字典而不是a,defaultdict并重新反转它,如下所示:

>>> for key, inner_d in d.iteritems():
...     key_str = ''.join(inner_d[k][0] for k in ['dst', 'src', 'alias'] if k in inner_d)
...     reverse_d[key_str] = key
>>> new_d = dict((val, d[val]) for val in reverse_d.itervalues())

扫码关注云+社区

领取腾讯云代金券