-1

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

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

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

4

3 回答 3

2

当您点击第一个非负数时,if不会再次输入,也不会再i增加。将增量部分放在块i外。if

于 2013-10-08T22:38:55.837 回答
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您将获得值01和for 。所以你不需要自己增加它。23i

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

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

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

于 2013-10-08T22:43:46.540 回答
0

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

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

这在其他答案中是隐含的,但是它可能对潜伏者和 OP 考虑以后有用...... 虽然确实像其他答案所示的那样工作,但它在列表理解中是“免费的”;另外,这里没有无限循环的机会....

于 2013-10-08T23:48:11.297 回答