在python中我正在寻找一种方法来从包含重复键的文件加载静态声明的字典时收到警告或错误,对于我的用例,该文件来自用户输入,所以我想确保字典我收到没有重复的密钥。在得到字典2与字典2相同并且python字典保持最右边的键/值对之后我得到了。我正在寻找的是一种在加载之前或加载期间得到警告或错误的方法,这表明dictionary1有多个重复" a"密钥。
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 :(得分:2)
您可以使用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}
'''))