检查项目是否是dict键的一部分

时间:2016-03-17 07:56:30

标签: python dictionary

我有以下工作者字典(每个值2个键):

worker = {('admin', 'unknown'): 1, ('worker1', 'Paul'): 1,  ('worker2', 'Francis'): 1}

在我的代码中,我想检查一个worker函数是否已经有一个条目:

if work['function'] in worker:
    # increment amount

为什么这不是真的? work['function']将为adminworker1等。

是否因为我必须在if中指定dict的第二个键?因为我不能/不想那样做

我怎样才能说明这一点?

4 个答案:

答案 0 :(得分:1)

词典的关键是一个元组,如('admin', 'unknown')。您可以轻松地测试这是否有效:

if ('admin', 'unknown') in worker:
    print("toto")

因此,如果您希望能够仅检查是否存在管理员,则有两种选择:

  • 更改您的数据结构(例如,对于dicts的词典)
  • 使用一个函数来迭代dict的所有项目以进行你想要的比较(并且如果dict很大则会遇到糟糕的表现)[编辑:通常由列表理解解决方案提出Merlin2011在他的回答中]

执行你所描述的词汇的dict示例:

worker = {'admin':{'unknown': 1}, 'worker1':{'Paul': 1},  'worker2':{'Francis': 1}}
if 'admin' in worker:
    print("Here is admin")

在你的情况下,你可能更想要一个简单的字典,因为你显然总是只有一组与一个键对应的值,所以简单地说:

worker = {'admin': ('unknown', 1), 'worker1': ('Paul', 1), 'worker2': ('Francis', 1) }

答案 1 :(得分:0)

你可以使用 itemgetter 轻松获得关键元组的第一项。

from operator import itemgetter

if work['function'] in map(itemgetter(0), worker):
    # increment amount

答案 2 :(得分:0)

Python不会将这样的词典解释为"每个值的两个键",但是"键是元组"。这意味着('admin', 'unknown') in worker将产生True,但不会产生'admin' in worker

如果您希望每个条目具有多个键的字典,则需要不同的数据结构。您可以构建自己的或使用现有的the multi_key_dict package

你也可以遍历键并搜索你的字符串是否包含在键中,如下所示:

for k in worker.keys():
   if work['function'] in k:
       return k

答案 3 :(得分:0)

如果您不想指定密钥的第二部分,可以使用列表解析来查找与密钥的第一部分匹配的所有内容。请注意,性能是线性的,而不是O(1),就像从哈希表中获得的那样。

worker = {('admin', 'unknown'): 1, ('worker1', 'Paul'): 1,  ('worker2', 'Francis'): 1}

matching_keys = [key for key in worker if key[0] == "admin"]
for key in matching_keys:
    worker[key]+=1

print worker