从字典中删除重复项

Bit*_*ket 31 python dictionary duplicates

我有以下Python 2.7字典数据结构(我不控制源数据 - 来自另一个系统):

{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']
   },
 112765083670: ...
}

字典键将始终是唯一的.Dst,src和别名可以是重复的.所有记录都将始终具有dst和src,但并非每条记录都必须具有第三条记录中显示的别名.

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

我的目标是删除所有重复dst,src和别名的记录 - 无论密钥是什么.

这个菜鸟怎么做到这一点?

另外,我对Python的有限理解将数据结构解释为字典,其值存储在字典中...这是一个dicts的字典,这是正确的吗?

And*_*Cox 42

您可以浏览字典中的每个项目(键值对),如果值尚未包含在结果字典中,则将它们添加到结果字典中.

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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的起点,但我不得不指出,对于大量数据集合来说它会很慢,因为对于每个循环,它会创建一个新的值列表并对其进行线性搜索. (9认同)

sen*_*rle 5

一种简单的方法是使用每个内部字典中的字符串数据的串联作为键来创建反向字典。假设您在字典中拥有上述数据d

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

如果您不希望有重复项或类似内容的列表,而只想创建一个无重复项的字典,则可以使用常规词典而不是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())
Run Code Online (Sandbox Code Playgroud)