使用while循环返回索引

时间:2013-10-08 22:38:02

标签: python

我正在尝试输入一个数字列表,并返回原始列表中包含负值的索引列表。我也想使用while循环。到目前为止,这是我的代码。

def scrollList2(myList):
    negativeIndices = []
    i = 0
    while i < len(myList):
        if myList[i] < 0:
            i = i + 1
            negativeIndices.append(i)
    return negativeIndices    

如何停止循环以及如何让索引返回?现在当我运行它时,它会永远运行(无限循环)一旦它命中myList的最后一个索引,我怎么告诉它停止?

3 个答案:

答案 0 :(得分:2)

当您点击第一个非负数时,if永远不会再次输入,i永远不会再次增加。将部分放在i块之外if增加的位置。

答案 1 :(得分:1)

while i < len(myList):
    if myList[i] < 0:
        i = i + 1
        negativeIndices.append(i)

假设条件myList[i] < 0不成立。在这种情况下,i将不会增加,也不会发生任何其他情况。因此,您将在下一次迭代中结束,具有相同的i值并且具有相同的条件。永远,无休止的循环。

无论您是否匹配,都需要增加i。因此,您必须将增量置于if条件之外。此外,您希望在将索引附加到列表后增加i ,因此您实际上附加了您测试的索引,而不是之后的索引:

while i < len(myList):
    if myList[i] < 0:
        negativeIndices.append(i)
    i = i + 1

此外,您通常会在此处使用for循环。它将自动为您提供i的所有值,您需要为myList中的每个元素编制索引。它的工作原理如下:

negativeIndices = []
for i in range(len(myList)):
    if myList[i] < 0:
        negativeIndices.append(i)

range(len(myList))将为您提供从零到列表长度的每个数字的值序列(不包括长度本身)。因此,如果您的列表包含4个值,您将获得0的值123i。所以你不需要自己动手增加它。

Foo Bar User提到的另一种可能性是enumerate。该函数将在您的情况下采用序列或列表,并同时为您提供索引和值:

negativeIndices = []
for i, value in enumerate(myList):
    if value < 0:
        negativeIndices.append(i)

正如您所看到的,这完全消除了通过索引访问列表的需要。

答案 2 :(得分:0)

OP希望使用while循环,所以这个答案并不完全正确 - 但我觉得我应该指出许多pythonistas会期望类似的东西:

neg_indices = [k for k,v in enumerate(myList) if v < 0]

这在其他答案中是隐含的,但是对于潜伏者和OP来说可能会有所帮助。虽然肯定会像其他答案所显示的那样完成工作但是它的'免费'列表理解;另外,这里没有无限循环的机会......