如果我有一个字典,其中每个值都是一个列表,我如何检查我的列表中是否有特定的元素?例如:
myDict = { 0 : ['a','b','c'],
1 : ['d','e','f']}
如何检查'a'
是否存在?
发布于 2018-01-17 12:28:36
检查所有值
我们可以使用itertools.chain,并在一个相当自我解释的班轮中使用它。
from itertools import chain
if 'a' in chain.from_iterable(myDict.values()):
# do something
pass
在这里,我们将列表的.values()
链接到一个可迭代的位置,从而检查'a'
的成员资格。
请注意,这与列表中的值总数一起以线性时间运行。如果您必须执行一次成员资格检查,我们不能对它做很多事情,但是如果我们必须多次检查它,最好将值缓存在一个集合中(假设值是hashable的)。
检查特定的密钥
如果您想要检查特定的键,我们只需查找相应的值并检查成员资格:
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
发布于 2018-01-17 12:23:10
您可以使用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)
发布于 2018-01-17 12:26:57
当有人想要浏览字典的值时,我总是觉得很奇怪。如果做很多次,这是非常没有效率的。
相反,我会构建另一个字典,或者一个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
是超快和简洁的。在原始数据集上构建尽可能多的集和字典,以获得快速查找。
https://stackoverflow.com/questions/48309380
复制