用于检查字典中是否存在N个键的功能

时间:2017-11-06 22:13:11

标签: python dictionary

我希望创建一个函数来检查字典中是否存在多个键,并返回一个值,指示存在哪些键。我知道我可以这样写:

def param_checker(parameters):
    if 'foo' in parameters:
        if 'bar' in parameters:
            if 'qux' in parameters:
                return 0
            else:
                return 1
        elif 'baz' in parameters:
            if 'qux' in parameters:
                return 2
            else:
                return 3
        else:
            return 4
    elif 'quxx' in parameters:
        if 'bar' in parameters:
            return 5
        elif 'qux' in parameters:
            if 'baz' in parameters:
                return 6
            else:
                return 7
        else:
            return 8
    else:
        return 9

然而,上面的例子既凌乱又笨重。复杂性也会随着您需要检查以返回值的参数数量而扩展。例如,我需要3层if条件来检查密钥foobarqux。我知道我可以内联链接if条件,但它仍然是凌乱和笨重的。

这有点类似于Python check if list of keys exist in dictionary。这里最大的区别是,我不是要检查它们是否都存在,而是要返回一个值,表明存在哪些键组合。

注意:我没有在提供的示例代码中写出所有可能的组合,因为当我试图说明问题时,这将是乏味的。

下面是调用函数来检查存在哪些键的示例。

d = dict()
d['foo'] = 'blah'
d['bar'] = 'blah'

val = param_checker(d)
# val represents a unique value indicating which keys are present in dictionary d

我会提前知道可以在词典中的哪些键,所以我可以找到某种可能的键列表,例如:

keys = ["foo", "bar", "baz", "qux", "quxx"]

我希望构建一个可以检查N个键并返回唯一值的函数,该值指示哪些键存在。我怎样才能有效地做到这一点?

4 个答案:

答案 0 :(得分:1)

keyseq = ('foo', 'bar', 'quux')
keymap = {key: 1 << e for (e, key) in enumerate(keyseq)}
return sum(keymap[key] for key in keymap if key in D)

答案 1 :(得分:0)

像这样的东西(假设是Python 3)?

from itertools import compress

queries = ["a", "b", "c", "d"]
in_dict = [q in d for q in queries]
existing_keys = compress(queries, in_dict)

您当然可以将此包装在queries成为输入参数且d是输入字典的函数中。

答案 2 :(得分:0)

制作一组所需的钥匙。 制作一组dict的键。 走十字路口。计数。

master = {
    "foo": 1,
    "bar": 5,
    "qux": 18,
    "lemon": -6,
    "quxx": "How boring are examples?",
    "dog": False
}

tag = {
    "foo", "bar", "baz", "qux", "quxx"
}

master_set = set(master.keys())
found =  master_set.intersection(tag)

print (len(found), found)

输出:

4 {'quxx', 'foo', 'qux', 'bar'}

答案 3 :(得分:0)

你可以试试这个:

keys = ["foo", "bar", "baz", "qux", "quxx"]
counter = {i:d.keys().count(i) for i in keys}