簡體   English   中英

如何在一個循環中比較兩個列表的值是否相等?

[英]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,則有兩個問題:

  1. 您只想在for循環的開頭指定i
  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

我認為, enumeraterange可讀性的提高大部分通過定義一個從未使用過的額外變量( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM