如何在一个循环中比较两个列表的值的相等性?

时间:2013-05-16 17:22:59

标签: 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'

出了什么问题?

3 个答案:

答案 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,有两个问题:

  1. 您只想在i - 循环的开头指定for
  2. L2可能没有与L1一样多的商品。

  3. 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'