1

诚然,我没有对这个主题进行大量研究,但我正在努力快速完成一些事情。我有一个字典,其中整数作为键,列表作为值。以前,我用一个简单的 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 的简洁性和便利性深入人心,因此我认为对于我正在测试的内容可能会有更好的解决方案。如果没有,我可以让迭代工作,但如果有,我将不胜感激!

提前致谢!

4

2 回答 2

3

使用带有生成器表达式的any()函数来查找是否有任何字典值包含您的项目:

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没有找到匹配项。

于 2013-07-26T15:00:33.913 回答
1

试试这个,假设你想检查第一个元素someList与所有someDictionary列表值中的第一个元素(问题中的代码似乎表明这就是你想要的):

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()
于 2013-07-26T14:57:12.710 回答