3

有时我有一个列表列表,我需要在所有列表中搜索单个项目。我使用这个 python 代码:

boolean found = false

for(hayStack : listOfHayStacks){
   found = findNeedle(hayStack)

   if(found)
      break;
}

if(!found){
    // error case
}

我似乎经常遇到这种情况,我总觉得应该有更好的方法来处理这种情况。

是否有一个总结所有结果的:“atLeastOne”结构?

4

3 回答 3

3

Python 对此有特殊的语法。

for haystack in haystacks:
    if find_needle(haystack):
        break
else:
    # error case (did not break)

根据您在代码中需要多少逻辑,您还可以执行以下操作:

some_needles_exist = any(find_needle(x) for x in haystacks)
all_stacks_have_needles = all(find_needle(x) for x in haystacks)
于 2013-04-22T21:02:30.353 回答
0

您始终可以创建一个单独的函数,在该函数中使用双 for 循环。它可能更具可读性:

for (hayStack : listOfHayStacks) {
    for (needle : hayStack) {
        if needle satisfies criteria
            return true
    }
}
return false

搜索所有干草堆的问题在于,如果您可以在最初的几个干草堆中返回,那么您可能会浪费大量时间。

于 2013-04-22T20:58:59.250 回答
0

如果您要更多地专注于在大海捞针中找到或不找到针的操作,那么您可以执行以下操作:

>>> criteria = lambda n: n == 3
>>> def found(needle):
    if criteria(needle):
        print("Doing something as found")
        return True
    else: return False


>>> def missed():
    print("Doing missed action")
    return False

>>> wasfound = any(found(i) for i in range(2)) or missed()
Doing missed action
>>> wasfound
False
>>> wasfound = any(found(i) for i in range(4)) or missed()
Doing something as found
>>> wasfound
True
>>> 
于 2013-04-23T03:27:09.377 回答