2015-05-13 148 views
-3

我需要幫助,試圖編寫一個函數來檢測是否有包含多個鍵的字典。所以即時卡住,因爲當使用name_to_age字典將已經是唯一的,所以我不知道如何我可以應用此檢查。python在字典中檢查重複鍵

爲e.g

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

標題涉及重複鍵(這在Python字典中是不可能的),但問題提到了多個鍵。你的意思是? – mambocab

+0

你已經知道答案。 –

+1

嘗試'打印name_to_age'並查看當你重寫一個鍵時會發生什麼... – alfasin

回答

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結構爲每個鍵創建值列表,但那些別不能解決原始問題對重複鍵的假設。這個答案創建了一個場景,其中可能有重複的「鍵」並提供檢測它們的功能。

+1

不同意。鍵是每個對象的內存位置,這是唯一的。 >>> [id(a)for a alternate] Out [168]:[4489414544,4489414352,4489414480] – Alexander

+0

如果鍵完全相同,那麼使用'is'進行檢查會產生True(例如,person(「 Andrew「)是人(」Andrew「)產生False,因爲創建了兩個單獨的對象,每個對象都駐留在自己的內存位置)。 – Alexander

+0

您還需要維護對該鍵使用的確切實例的引用,因爲'person .__ eq__'沒有被定義。這使得這種方法或多或少沒有用處。 – wim