[英]How can I compare for equality the values of two lists in one loop?
所以我想這樣做,以便我可以檢查另一個代碼是否正常工作,但是我一直收到此錯誤:
'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
步驟以使用您喜歡的測試。 您可能還需要為izip_longest
使用不同的fillvalue
參數。
實際上,這是一個將空地方等同於任何事物的版本:
nonce = object()
all(((a == b) or (nonce in (a,b)) for a,b in itertools.izip_longest(L1, L2, fillvalue=nonce))
假設這是Python,則有兩個問題:
for
循環的開頭指定i
。 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
在range
可讀性的提高大部分通過定義一個從未使用過的額外變量( l1
)來抵消。 但這只是我的意見。
最好的最后一種選擇是使用zip
合並兩個列表( zip
截斷兩個列表中的較長者):
for i, l1, l2 in enumerate( zip(L1, L2) ):
if l1 == l2:
L1[i] = 'ok'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.