我希望创建一个函数来检查字典中是否存在多个键,并返回一个值,指示存在哪些键。我知道我可以这样写:
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
条件来检查密钥foo
,bar
和qux
。我知道我可以内联链接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
个键并返回唯一值的函数,该值指示哪些键存在。我怎样才能有效地做到这一点?
答案 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}