同时迭代多个列表并捕获值

时间:2017-01-17 19:24:05

标签: python python-2.7 list

考虑API返回四个列表作为输出。我们将输出视为

a = [1,2,3,4]
b = [1,2,3,4]
c = [1,2,4,3]
d = [1,2,3,5]

现在,首先我们要比较这些列表是否相等。

仅当元素和索引匹配时,列表才相等。 例如,从上面的列表中,ab是相同的。但ac不相等。

如果列表不相等,则输出预期为:此列表中此索引处的此元素与其他不同。

为了比较和获得两个列表的差异,我写了以下代码。

for i in range(len(a)):
    if a[i] != c[i]:
        print "Expected value at ",i," is ",a[i]
        print "But got value ",c[i],"in second list"    

现在问题是如何为以上四个列表实现这一目标?

3 个答案:

答案 0 :(得分:4)

您可以使用zip同时迭代每个列表并比较每个索引的值。在下面的示例中,我将列表a的值与剩余列表进行比较。

a = [1,2,3,4]
b = [1,2,3,4]
c = [1,2,4,3]
d = [1,2,3,5]

for i, x in enumerate(zip(a, b, c, d)):
    print('--------- Index: {}'.format(i))
    base = x[0]
    for j, y in enumerate(x[1:], 2):
        if base!=y:
            print('{} not equal to {} : --> List {}'.format(base, y, j))

打印:

--------- Index: 0
--------- Index: 1
--------- Index: 2
3 not equal to 4 : --> List 3
--------- Index: 3
4 not equal to 3 : --> List 3
4 not equal to 5 : --> List 4

答案 1 :(得分:1)

来自评论:

  

如何找到我们有不同价值的列表?

import collections as ct

counter = ct.Counter(map(tuple, [a,b,c,d]))                # make hashable keys w/tuples
base = counter.most_common(1)[0][0]                        # find most frequent sequence
[list(seq) for seq in counter if seq != base]              # filter uncommon sequences

输出(不匹配列表):

[[1, 2, 4, 3], [1, 2, 3, 5]]

我们会在sequences中收集所有类似的collections.Counter作为密钥。如果所有序列都匹配,则Counter字典中应该只有一个条目。否则,过滤剩余的序列。

答案 2 :(得分:0)

设置列表mylist = [a, b, c,d]然后循环检查哪些是相等的以及哪些不相等。

for i in range(len(mylist)-1)
   for j in range(i+1, len(mylist))
       # Check mylist[i] agaist mylist[j] and report results

例如,这将针对b,c和d执行测试 b针对c和d
c反对d