1

所以我想做这个,所以我可以检查另一个代码是否正在工作,但我一直收到这个错误:

'list index out of range'

对于以下代码:

for L1[i] in range(0, len(L1)):
    if L1[i]==L2[i]:
        L1[i]='ok'

出了什么问题?

4

3 回答 3

1

您可能正在寻找更像这样的东西。我建议预先验证您的列表长度是否相等,这样您的循环就不会失败。

assert len(L1) == len(L2)

for i in range(len(L1)):
    if L1[i] == L2[i]:
        L1[i] = 'ok'

或者,如果您的列表具有不同的长度是可以接受的,只需将两个长度中的最小值作为您的唯一上限。

upper_bound = min(len(L1), len(L2))
for i in range(upper_bound):
于 2013-05-16T17:28:08.683 回答
1

怎么样:

import itertools
zipped_pairs = itertools.izip_longest(L1, L2, fillvalue=object()) # generator of pairs (L1[n],L2[n])
equals_tests = (a == b for a,b in zipped_pairs) # perform equality test on each pair
all_equal = all(equals_tests) # True if all of the equals_tests items are True

或者在一行中:

all((a == b for a,b in itertools.izip_longest(L1, L2, fillvalue=object()))

请注意,只要 L1 和 L2 的长度不同,这最终将返回 false。如果您想要其他内容,请更改equals_tests步骤以使用您喜欢的测试。您可能还需要fillvalueizip_longest.

事实上,这里有一个版本,它将一个空的地方视为等同于任何东西:

nonce = object()
all(((a == b) or (nonce in (a,b)) for a,b in itertools.izip_longest(L1, L2, fillvalue=nonce))
于 2013-05-16T18:06:32.747 回答
0

假设这是 Python,有两个问题:

  1. 您只想在-loopi的开头指定。for
  2. L2可能没有L1.

for i in range(0, len(L1)):
    try:
        if L1[i] == L2[i]:
            L1[i] = 'ok'
    except IndexError:
        break

正如 Frederik 指出的那样,您也可以使用enumerate

for i, l1 in enumerate(L1):
    try:
        if L[i] == L2[i]:
            L1[i] = 'ok'
    except:
        break

在我看来,enumerateover可读性的增加主要是通过定义一个你从不使用range的额外变量 ( ) 来抵消的。l1但这只是我的意见。


最后一个可能是最好的选择是用于zip合并两个列表(zip截断两者中较长的一个):

for i, l1, l2 in enumerate( zip(L1, L2) ):
    if l1 == l2:
        L1[i] = 'ok'
于 2013-05-16T17:27:31.177 回答