如果我有一个字典,其中每个值都是一个列表,我如何检查列表中是否有特定元素?例如:
myDict = { 0 : ['a','b','c'],
1 : ['d','e','f']}
如何检查'a'
是否存在?
答案 0 :(得分:8)
您可以使用any
:
any('a' in lst for lst in myDict.values())
这将停止迭代并在第一次查找时评估为True
。 any
是以下模式的内置快捷方式:
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