如何检查字典,其中值是该列表元素的列表?

时间:2018-01-17 20:21:56

标签: python list dictionary

如果我有一个字典,其中每个值都是一个列表,我如何检查列表中是否有特定元素?例如:

myDict = { 0 : ['a','b','c'],
           1 : ['d','e','f']}

如何检查'a'是否存在?

3 个答案:

答案 0 :(得分:8)

您可以使用any

any('a' in lst for lst in myDict.values())

这将停止迭代并在第一次查找时评估为Trueany是以下模式的内置快捷方式:

for x in y:
    if condition:
        return True
return False
# return any(condition for x in y)

答案 1 :(得分:2)

当有人想要扫描字典的值时,总是让我感到奇怪。如果多次这样做,效率会非常高。

相反,我会构建另一个字典,或者set进行快速检查:

myDict = { 0 : ['a','b','c'],
           1 : ['d','e','f']}

rset = {x for v in myDict.values() for x in v}

print(rset)

给出:

{'b', 'e', 'c', 'd', 'a', 'f'}

现在:

'a' in rset

非常快速和简洁。建立尽可能多的套装和您需要在原始数据集上进行快速查找的字典。

答案 2 :(得分:1)

检查所有值

我们可以使用itertools.chain并在一个相当自我解释的单线中使用它:

from itertools import chain

if 'a' in chain.from_iterable(myDict.values()):
    # do something
    pass

在这里,我们将列表的.values()链接在一个可迭代的内容中,从而检查'a'的成员资格。

请注意,这会在线性时间内以列表中的值总数运行。如果你必须一次执行成员资格检查,我们无法做很多事情,但是如果我们必须多次检查它,最好将值缓存在一个集合中(假设值是可清除的)。

检查特定密钥

如果您想检查特定密钥,我们只需查找相应的值并检查成员资格:

if 'a' in myDict[0]:
    # do something
    pass

如果不确定密钥是否出现在myDict中,并且我们希望在这种情况下返回False,我们可以使用.get(..)并使用() (空元组)作为后备值:

# will not error, but False in case key does not exists
if 'a' in myDict.get(0, ()):
    # do something
    pass