2011-05-10 48 views
7

是否有可能在python中以一種必須具有唯一鍵的方式設計字典,並且如果錯誤地添加字典中已有的鍵被拒絕。 謝謝如何強制Python中的字典只有唯一的密鑰?

+1

我想指出,「唯一鍵」是字典的固有屬性。當您插入一個鍵/值對時,它會更新任何可能導致重複鍵的以前的條目。因此,你的問題讓我陷入了一個循環。現在,當我更仔細地閱讀這篇文章時,我明白你所要求的是防止這種更新 - 這是一個有效且可理解的擴展。我只是想爲其他讀者澄清這一點,所以他們不會認爲他們需要在更廣義的意義上防止重複密鑰。 – BuvinJ 2017-03-05 15:56:46

+0

^是的,正如我們在下面user2197172的回答中看到的那樣,使用'setdefault'是補充:它悄悄地吞下嘗試添加重複鍵的嘗試。 – 2017-10-02 16:10:06

回答

18

你總是可以創建自己的字典

class UniqueDict(dict): 
    def __setitem__(self, key, value): 
     if key not in self: 
      dict.__setitem__(self, key, value) 
     else: 
      raise KeyError("Key already exists") 
+10

請注意,'__init__'方法實際上並不需要,只是使用相同的參數調用父'__init__'。 – 2011-05-10 10:38:45

+0

哇,我不知道,謝謝^^ – 2011-07-16 10:36:21

+0

我認爲這是正確的答案,但我並不愛這個班的名字。看到我對最初問題的評論。也許像「InsertOnlyDict」或「NoUpdateDict」等更清晰? – BuvinJ 2017-03-05 16:00:57

0

您可以通過從dict派生和重寫__setitem__來創建自定義字典來拒絕字典中已有的項目。

+0

你能舉個例子嗎?我不是那個親python.thx – Hossein 2011-05-10 09:31:14

+1

@Hossein:@Jakobs答案提供了一個例子。 – 2011-05-10 09:35:56

4

只是檢查你的字典你添加的項目

if 'k' not in mydict: 
    mydict.update(myitem) 
+0

你可以這樣做:'if'k'not in mydict' without the .keys()':) – mouad 2011-05-10 10:06:54

+1

@singularity:你應該(不能)避免使用'.keys()'...這是一個總的浪費的資源。 – 2011-05-10 11:30:53

+0

對不起,這是一個疏忽。修復它的答案。 – Gevious 2011-05-10 12:58:21

1

這是setdefault的目的之前:

>>> x = {} 
>>> print x.setdefault.__doc__ 
D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D 
>>> x.setdefault('a', 5) 
5 
>>> x 
{'a': 5} 
>>> x.setdefault('a', 10) 
5 
>>> x 
{'a': 5} 

這也意味着你可以在字典中跳過「if key」:...:else「...」

>>> for val in range(10): 
...  x.setdefault('total', 0) 
...  x['total']+=val 
... 
0 
0 
1 
3 
6 
10 
15 
21 
28 
36 
>>> x 
{'a': 5, 'total': 45} 
+0

這是一個可愛的答案,事實上重複的鑰匙被悄悄地吞噬 - 是否與「被拒絕」一樣?沒有例外。 – 2017-10-02 15:37:28

相關問題