首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查字典,其中值是该列表的一个元素的列表?

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

Stack Overflow用户
提问于 2018-01-17 20:21:55
回答 3查看 56关注 0票数 0

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

代码语言:javascript
运行
复制
myDict = { 0 : ['a','b','c'],
           1 : ['d','e','f']}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-17 20:28:36

检查所有值

我们可以使用itertools.chain,并在一个相当自我解释的班轮中使用它。

代码语言:javascript
运行
复制
from itertools import chain

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

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

请注意,这与列表中的值总数一起以线性时间运行。如果您必须执行一次成员资格检查,我们不能对它做很多事情,但是如果我们必须多次检查它,最好将值缓存在一个集合中(假设值是hashable的)。

检查特定的密钥

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

代码语言:javascript
运行
复制
if 'a' in myDict[0]:
    # do something
    pass

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

代码语言:javascript
运行
复制
# will not error, but False in case key does not exists
if 'a' in myDict.get(0, ()):
    # do something
    pass
票数 1
EN

Stack Overflow用户

发布于 2018-01-17 20:23:10

您可以使用any

代码语言:javascript
运行
复制
any('a' in lst for lst in myDict.values())

这将停止迭代,并在第一次查找时计算到Trueany是以下模式的内置捷径:

代码语言:javascript
运行
复制
for x in y:
    if condition:
        return True
return False
# return any(condition for x in y)
票数 8
EN

Stack Overflow用户

发布于 2018-01-17 20:26:57

当有人想要浏览字典的值时,我总是觉得很奇怪。如果做很多次,这是非常没有效率的。

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

代码语言:javascript
运行
复制
myDict = { 0 : ['a','b','c'],
           1 : ['d','e','f']}

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

print(rset)

给予:

代码语言:javascript
运行
复制
{'b', 'e', 'c', 'd', 'a', 'f'}

现在:

代码语言:javascript
运行
复制
'a' in rset

是超快和简洁的。在原始数据集上构建尽可能多的集和字典,以获得快速查找。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48309380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档