Python - 检查作为字典一部分的列表中的值的便捷方法?

时间:2013-07-26 14:54:55

标签: python list dictionary include

我承认没有对这个话题进行过大量的研究,但我想尽快完成一些事情。我有一个字典,整数作为键,列表作为值。以前,我正在使用简单的if语句检查字典中的列表:

if(someList is in someDictionary.values()):
    someCode() #failure

然而,我意识到这对我正在做的事情是不正确的,我只想检查列表的第一个值是否包含在字典的值中,例如

if(someList[0] == someValueInDictionary[0]):
    someCode() #failure

我第一次尝试

if(someList[0] is in someDictionary.values()[0]):
    someCode() #failure

但这显然不起作用。因为someDictionary.values()本身就是一个列表。我意识到我可以遍历所有要检查的值,例如

for list in someDictionary.values():
    if(someList[0] == list[0]):
        someCode() #failure
actualCode() #success

但是这真的弄乱了我程序的流程。我是一名新的Python程序员,最有经验的Java,我试图在我的骨头中获得Python的简洁性和便利性,因此我认为可能有更好的解决方案来测试我的内容。如果没有,我可以让迭代的东西工作,但如果有的话,我会非常感激它!

提前致谢!

2 个答案:

答案 0 :(得分:3)

any() function与生成器表达式一起使用,以查找是否存在包含项目的任何字典值:

if any(someList[0] in v for v in someDictionary.itervalues()):
    # item found

在Python 3上使用someDictionary.values()。生成器表达式循环遍历字典值(不首先生成所有值的列表),并在迭代生成器表达式的同时逐个对每个值进行测试。

any()仅测试生成器表达式中的元素,直到其中一个为True,然后停止循环,从而使其相对有效。

如果您需要具有匹配值的键,请使用next()

next((k for k, v in someDictionary.iteritems() if someList[0] in v), None)

返回匹配的键,或者找不到匹配的None

答案 1 :(得分:1)

尝试此操作,假设您要针对所有someList列表值中的第一个元素检查someDictionary的第一个元素(问题中的代码似乎表示& #39; s你想要的东西):

if someList[0] in (x[0] for x in someDictionary.itervalues()):
    someCode()

但是,如果你想要的是检查someList的第一个元素是否在任何的值列表中,那么试试这个:

import itertools as it
if someList[0] in it.chain(*someDictionary.itervalues()):
    someCode()