2017-05-11 95 views
0

在python中,我正在尋找一種方法來從包含重複鍵的文件中加載靜態聲明的字典時收到警告或錯誤,對於我的用例,該文件來自用戶輸入,所以我想確保我收到的字典沒有重複的密鑰。在load dictionary1與dictionary 2相同並且python字典保留最右邊的鍵/值對之後,我得到了這個結果。我正在尋找的是一種在加載之前或加載過程中發出警告或錯誤的方式,表示dictionary1有多個重複的「a」鍵。Python識別重複的字典鍵

dictionary1 = {"a":1, "a":2, "a":3} 
dictionary2 = {"a":3} 

,我能想到的是使用字典的列表,然後將每個字典最終字典,如下面的例子中的最好的辦法。這可行,但字典列表不像標準字典那樣用戶友好。

listofDicts = [{"a":1},{"a":2},{"a":3}] 
masterDict = {} 
for entry in listofDict: 
    for subDict in entry: 
     if subDict in masterDict.keys(): 
      print ("ERROR key \"%s\" already exists with value %d" % (subDict, masterDict[subDict])) 
     else: 
      masterDict.update({subDict:entry[subDict]}) 
+0

什麼是你的文件的格式?作爲旁邊的 –

+1

,'如果masterDict.keys()中的子字典:'是反模式。你正在爲'masterDict'中的所有鍵創建一個'list',然後在該列表上做一個O(N)操作的成員測試,但是如果你剛剛完成了'if subDict in masterDict',有O(1)字典密鑰成員資格測試。 –

+0

使用'json.loads'解析你的文件,然後參考這裏發佈的答案: http://stackoverflow.com/questions/14902299/json-loads-allows-duplicate-keys-in-a-dictionary-overwriting -the-first-value –

回答

1

可以使用ast模塊解析Python源代碼中包含字典文件,查找字典文字重複鍵:

import ast 
import logging 

class DuplicateKeyVisitor(ast.NodeVisitor): 
    def visit_Dict(self, node): 
     seen_keys = set() 

     for key_node in node.keys: 
      try: 
       key = ast.literal_eval(key_node) 
      except ValueError: 
       continue 

      if key in seen_keys: 
       logging.warning('Dictionary literal at (%d, %d) has duplicate keys', node.lineno, node.col_offset) 

      seen_keys.add(key) 

DuplicateKeyVisitor().visit(ast.parse(''' 
foo = {'a': 1, 'a': 2} 
bar = {'a': 1, 'b': 2} 
bar = {'a': 1, 'b': 2, 'a': 3} 
''')) 
+0

定義它們之後不會刪除多個鍵(Prevailing the last value)?爲什麼這是必要的? –

+1

@ViníciusAguiar:他們這樣做,但問題是要求知道你正在加載的Python文件是否包含有重複鍵的字典文字。 – Blender

+0

我正在尋找一種方法,不需要整個字典在一個字符串到期,有沒有一種方法來應用類似的技術,其中字典被聲明在像a = {1:「a」,1:「 b「}而不是a =」「」{1:「a」,1:「b」}「」「 – jprince14