【问题标题】:Pythonic way to compare two lists and print out the differences比较两个列表并打印出差异的 Pythonic 方法
【发布时间】:2019-01-29 17:43:06
【问题描述】:

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

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)

【问题讨论】:

  • 函数式编程的救援:查看地图和压缩包!

标签: python comparison


【解决方案1】:
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]

【讨论】:

  • 元组解包会比索引更快。切片在 py3k 中也不起作用
  • 考虑从 itertools 切换到 izip,以获得长列表。它是迭代器版本。
  • @mizipzor 如果列表的长度不同,这将不起作用。 zip 会截断额外的元素。例如:list1=[1,2,3] list2=[1,2] 不匹配应该返回 [3,None] 而不是 []
  • @balki:对于不同长度的列表,最短的应该用None填充。
【解决方案2】:

没有人提到过滤器:

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

【讨论】:

    【解决方案3】:

    在标准库中有一个很好的类叫做difflib.SequenceMatcher

    【讨论】:

    • 我知道您将如何使用它来查找匹配的块,但不是不同的项目。还是我错过了什么?
    • @RyanWilcox:一旦你有匹配的块,这在 O(n) 中应该很容易
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      注意跳过第一行的要求:

      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. 这使用izipitertools 的迭代器版本zip,通过值对生成迭代器。这样您就不会消耗大量内存来生成完整的压缩列表。
      2. 它将both 迭代器加一个以避免处理第一项,并避免在循环的每一步都进行索引比较。它还使阅读更干净。
      3. 最后,它逐步遍历从仅产生不相等对的生成器返回的每个元组。

      【讨论】:

        【解决方案6】:

        你可以使用集合:

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

        【讨论】:

        • 我认为这不太合适。他们想将一个列表的第一个元素与另一个列表的第一个元素进行比较,然后将第二个元素与第二个元素进行比较,等等。由于集合没有排序,我认为这不适合这个问题。
        【解决方案7】:

        您可以使用set operation 查找两个列表之间的对称差异 (^)。这是最好的pythonic方法之一。

        list1=[1,2,3,4]
        list2=[1,5,3,4]
        
        print(set(list1) ^ set(list2))
        

        所以输出将是 {2, 5}

        【讨论】:

          猜你喜欢
          • 2013-04-25
          • 2019-05-15
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          • 2013-06-17
          • 2016-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多