Pythonic方式比较两个列表并打印出差异

时间:2010-03-05 15:50:14

标签: python comparison

我有两个保证长度相同的列表。我想比较列表中的相应值(第一项除外)并打印出不匹配的值。我这样做的方式就像这样

i = len(list1)
if i == 1:
    print 'Nothing to compare'
else:
    for i in range(i):
        if not (i == 0):
            if list1[i] != list2[i]:
                print list1[i]
                print list2[i]

有更好的方法吗? (Python 2.x)

7 个答案:

答案 0 :(得分:21)

list1=[1,2,3,4]
list2=[1,5,3,4]
print [(i,j) for i,j in zip(list1,list2) if i!=j]

输出:

[(2, 5)]

修改:轻松扩展以跳过 n 第一项(相同输出):

list1=[1,2,3,4]
list2=[2,5,3,4]
print [(i,j) for i,j in zip(list1,list2)[1:] if i!=j]

答案 1 :(得分:5)

没有人提到过滤器:

a = [1, 2, 3]
b = [42, 3, 4]

aToCompare = a[1:]
bToCompare = b[1:]

c = filter( lambda x: (not(x in aToCompare)), bToCompare)
print c

答案 2 :(得分:2)

编辑:oops,没有看到“忽略第一项”部分

from itertools import islice,izip

for a,b in islice(izip(list1,list2),1,None):
    if a != b:
       print a, b

答案 3 :(得分:2)

标准库中有一个名为difflib.SequenceMatcher的好类。

答案 4 :(得分:2)

注意跳过第一行的要求:

from itertools import izip
both = izip(list1,list2)
both.next()  #skip the first
for p in (p for p in both if p[0]!=p[1]):
   print pair
  1. 这使用izipzip的迭代器(itertools)版本,通过成对值生成迭代器。这样就不会消耗大量内存来生成完整的压缩列表。
  2. 它将both迭代器加1,以避免处理第一项,并避免必须在循环的每一步进行索引比较。它还使阅读更清晰。
  3. 最后,它逐步执行从生成器返回的每个元组,只生成不相等的对。

答案 5 :(得分:2)

你可以使用套装:

>>> list1=[1,2,3,4]
>>> list2=[1,5,3,4]
>>> set(list1[1:]).symmetric_difference(list2[1:])
set([2, 5])

答案 6 :(得分:0)

您可以使用user查找两个列表之间的对称差异(^)。这是执行此操作的最佳pythonic方法之一。

StudentProfile

所以输出将是      {2,5}