Python 如何比较一个循环中两个列表的值是否相等?

Python 如何比较一个循环中两个列表的值是否相等?,python,list,loops,itertools,Python,List,Loops,Itertools,所以我想这样做,这样我就可以检查另一个代码是否正常工作,但我一直得到这个错误: 'list index out of range' 对于以下代码: for L1[i] in range(0, len(L1)): if L1[i]==L2[i]: L1[i]='ok' 出了什么问题?假设这是Python,有两个问题: 您只想在for-循环的开头指定i L2的项目可能不如L1多 正如Frederik指出的,您还可以使用enumerate: for i, l1 in en

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

'list index out of range'
对于以下代码:

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

出了什么问题?

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

  • 您只想在
    for
    -循环的
    开头指定
    i
  • L2
    的项目可能不如
    L1

  • 正如Frederik指出的,您还可以使用
    enumerate

    for i, l1 in enumerate(L1):
        try:
            if L[i] == L2[i]:
                L1[i] = 'ok'
        except:
            break
    
    在我看来,
    enumerate
    range
    范围内可读性的提高主要是通过定义一个您从未使用过的额外变量(
    l1
    )来抵消的。但这只是我的意见


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


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

    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))
    

    也许你应该尝试
    范围内的i(…
    而不是
    L1[i]范围内的
    。这是什么语言?两个列表“相等”意味着什么?
    枚举
    只是添加了一个不必要的代码层,考虑到分配给
    L1[i]
    的要求。是的,这可能是一个更好的主意
    all((a == b for a,b in itertools.izip_longest(L1, L2, fillvalue=object()))
    
    nonce = object()
    all(((a == b) or (nonce in (a,b)) for a,b in itertools.izip_longest(L1, L2, fillvalue=nonce))