所以我想做这个,所以我可以检查另一个代码是否正在工作,但我一直收到这个错误:
'list index out of range'
对于以下代码:
for L1[i] in range(0, len(L1)):
if L1[i]==L2[i]:
L1[i]='ok'
出了什么问题?
您可能正在寻找更像这样的东西。我建议预先验证您的列表长度是否相等,这样您的循环就不会失败。
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):
怎么样:
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
步骤以使用您喜欢的测试。您可能还需要fillvalue
为izip_longest
.
事实上,这里有一个版本,它将一个空的地方视为等同于任何东西:
nonce = object()
all(((a == b) or (nonce in (a,b)) for a,b in itertools.izip_longest(L1, L2, fillvalue=nonce))
假设这是 Python,有两个问题:
i
的开头指定。for
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
在我看来,enumerate
over可读性的增加主要是通过定义一个你从不使用range
的额外变量 ( ) 来抵消的。l1
但这只是我的意见。
最后一个可能是最好的选择是用于zip
合并两个列表(zip
截断两者中较长的一个):
for i, l1, l2 in enumerate( zip(L1, L2) ):
if l1 == l2:
L1[i] = 'ok'