【问题标题】:Python Identify Duplicate Dictionary KeysPython识别重复的字典键
【发布时间】:2017-05-11 04:11:54
【问题描述】:

在 python 中,我正在寻找一种在从包含重复键的文件中加载静态声明的字典时接收警告或错误的方法,对于我的用例,该文件来自用户输入,所以我想确保字典我接收没有重复的密钥。我知道在加载字典 1 与字典 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]})

【问题讨论】:

  • 你的文件格式是什么?
  • 顺便说一句,if subDict in masterDict.keys(): 是一种反模式。您正在创建 masterDict 中所有键的 list,然后对该列表进行成员资格测试,这是一个 O(N) 操作,但如果您刚刚完成 if subDict in masterDict,您将有 O( 1) 字典键成员资格测试。
  • 使用json.loads 解析您的文件,然后参考此处发布的答案:stackoverflow.com/questions/14902299/…
  • 文件格式只是一个静态声明的.py文件,其中包含字典的定义。用户可能会多次错误地使用同一个字典键,因此我想在将其加载到处理输入文件的程序中时发现错误。我尝试使用 json.loads 但对于我收到的问题中的简单字典,例如 dictionary1 TypeError: expected string or buffer
  • 所以对于 json 我需要整个字典在一个我想避免的字符串中,有没有办法在检查重复键的同时将字典编码为 json?

标签: python python-2.7 dictionary


【解决方案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}
'''))

【讨论】:

  • 在定义多个键后,字典不会删除它们吗(以最后一个值为准)?为什么这是必要的?
  • @ViníciusAguiar:确实如此,但问题要求一种方法来了解您正在加载的 Python 文件是否包含具有重复键的字典文字。
  • 我正在寻找一种不需要整个字典都在一个字符串中的方法,有没有一种方法可以应用类似的技术,其中字典声明为 a = {1: "a", 1:"b"} 而不是 a = """{1: "a", 1:"b"}"""
  • @jprince14:字典是如何创建的?用户是否编辑您的脚本文件?
  • 用户手动创建一个 .py 文件,其中包含静态声明的字典,该字典使用 pickle 写入文件,然后我使用 pickle 加载字典。我想想出一些东西来为用户提供在调用pickle.dump之前检查他们的字典是否重复的东西。我为用户提供了一个模板文件,用他们自己的字典填写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多