所以我想这样做,所以我可以检查另一个代码是否正常工作,但我一直收到这个错误:
'list index out of range'
以下代码:
for L1[i] in range(0, len(L1)):
if L1[i]==L2[i]:
L1[i]='ok'
出了什么问题?
答案 0 :(得分: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):
答案 1 :(得分: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
步骤以使用您喜欢的测试。您可能还需要为fillvalue
使用不同的izip_longest
参数。
事实上,这是一个将空位视为等于任何东西的版本:
nonce = object()
all(((a == b) or (nonce in (a,b)) for a,b in itertools.izip_longest(L1, L2, fillvalue=nonce))
答案 2 :(得分:0)
假设这是Python,有两个问题:
i
- 循环的开头指定for
。L2
可能没有与L1
一样多的商品。for i in range(0, len(L1)):
try:
if L1[i] == L2[i]:
L1[i] = 'ok'
except IndexError:
break
正如弗雷德里克所指出的,你也可以使用enumerate
:
for i, l1 in enumerate(L1):
try:
if L[i] == L2[i]:
L1[i] = 'ok'
except:
break
在我看来,enumerate
超过range
的可读性的增加主要通过定义一个你从未使用的额外变量(l1
)来抵消。但这只是我的意见。
可能最好的最后一个选项是使用zip
合并两个列表(zip
截断两个列表中较长的一个):
for i, l1, l2 in enumerate( zip(L1, L2) ):
if l1 == l2:
L1[i] = 'ok'