python检查重复字典中的键

时间:2015-05-13 23:44:05

标签: python dictionary

我需要帮助尝试编写一个函数来检测是否存在包含多个键的字典。因此,当我使用name_to_age时,字典已经是唯一的,因此我不知道如何应用此检查。

例如

# the test function should raise an error since there is 2 duplicate keys
name_to_age = {'Sam': 2, 'Sam': 4, 'Alex: 14}

1 个答案:

答案 0 :(得分:1)

最初的问题是编写一个可以检测字典中重复键的函数。严格来说,字典不能包含重复的键,但它可以包含具有相同值的对象:Multiple identical keys in a Python dict - yes, you can!

诀窍是使用对象而不是字符串作为键,并覆盖哈希比较(参见How hash collisions are resolved in Python dictionaries):

class person(object):
    def __init__(self,name):
        self.name = name
    def __eq__(self, other):
        return False


alternate = {person("Andrew") : "Cambridge", person("Barbara") : "Bloomsbury", person("Andrew"): "Corsica"}
print alternate

下面的评论讨论了这些是否是重复密钥的技术方面,但这是一个侧面问题。回到最初的问题,如果字典实际上可以存在重复的键,那么哪个函数会检测到它们?

要查找重复的密钥,您可以执行以下操作:

def list_duplicates(d):
    seen = set()
    duplicates = set( x.name for x in d if x.name in seen or seen.add(x.name) )
    return list( duplicates )

(改编自另一个问题:Find and list duplicates in Python list

是的,multidict和querydict结构为每个键创建了值列表,但那些不能解决原始问题的重复键假设。这个答案创造了一个重​​复"键"是可能的,并提供检测它们的功能。