我承认没有对这个话题进行过大量的研究,但我想尽快完成一些事情。我有一个字典,整数作为键,列表作为值。以前,我正在使用简单的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的简洁性和便利性,因此我认为可能有更好的解决方案来测试我的内容。如果没有,我可以让迭代的东西工作,但如果有的话,我会非常感激它!
提前致谢!
答案 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()