【问题标题】:python compare items in 2 list of different length - order is importantpython比较2个不同长度列表中的项目 - 顺序很重要
【发布时间】:2015-08-27 19:24:35
【问题描述】:
list_1 = ['a', 'a', 'a', 'b']
list_2 = ['a', 'b', 'b', 'b', 'c']

所以在上面的列表中,只有索引 0 中的项目是相同的,而两个列表中的索引 1 到 4 是不同的。另外,list_2 有一个额外的项目'c'。 我想计算两个列表中索引不同的次数,在这种情况下我应该得到 3。

我试过这样做:

x = 0
for i in max(len(list_1),len(list_2)):
    if list_1[i]==list_2[i]:
        continue
    else:
        x+=1

我收到一个错误。

【问题讨论】:

  • 我猜索引 3 的元素也是一样的?
  • 你应该得到三个;索引 1 和 2 处的项目不同,并且您有 1 个额外元素。索引 0 和 3 处的元素相等。
  • 哦,是的,你是对的。那里有错字。

标签: python list loops for-loop indexing


【解决方案1】:

使用zip() function 将列表配对,计算所有差异,然后添加长度差异。

zip() 只会对可以配对的项目进行迭代,但对其余部分进行迭代没有意义;你知道这些都是不同的:

differences = sum(a != b for a, b in zip(list_1, list_2))
differences += abs(len(list_1) - len(list_2))

sum() 总结了TrueFalse 的值;这是因为 Python 的 boolean 类型是 int 的子类,False 等于 0True 等于 1。因此,对于每对不同的元素,!= 测试产生的True 值加起来为1s。

演示:

>>> list_1 = ['a', 'a', 'a', 'b']
>>> list_2 = ['a', 'b', 'b', 'b', 'c']
>>> sum(a != b for a, b in zip(list_1, list_2))
2
>>> abs(len(list_1) - len(list_2))
1
>>> difference = sum(a != b for a, b in zip(list_1, list_2))
>>> difference += abs(len(list_1) - len(list_2))
>>> difference
3

【讨论】:

    【解决方案2】:

    正如ZdaR 评论的那样,您应该得到 3 作为结果,如果您的列表中没有Nones,zip_longest 可以在这里提供帮助。

    from itertools import zip_longest
    
    list_1=['a', 'a', 'a', 'b']
    list_2=['a', 'b', 'b', 'b', 'c']
    x = sum(a != b for a,b in zip_longest(list_1,list_2))
    

    【讨论】:

    • 如果你可以预先计算出你会在那里找到多少元素,为什么要遍历list_2 中的所有额外元素。如果只有 1 个以上的元素,这不会有任何区别,但如果有 100 万个呢?您可以简单地获取列表长度的差异。
    • zip_longest() 需要一个额外的参数fillvalue。将其设置为object(),您就不必担心列表中的None 值。
    • @MartijnPieters 确实,这是正确的。但是,如果您出于某种原因不想检查长度,或者也不想获得带有人工值的匹配条目,那么它可能是有价值的。
    【解决方案3】:

    我可以用for循环试试这个方法吗:

    >>> count = 0
    >>> ls1 = ['a', 'a', 'a', 'b']
    >>> ls2 = ['a', 'b', 'b', 'b', 'c']
    >>> for i in range(0, max(len(ls1),len(ls2)), 1):
    ...     if ls1[i:i+1] != ls2[i:i+1]:
    ...         count += 1
    ...
    >>> print count
    3
    >>>
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      list1 = [1,2,3,5,7,8,23,24,25,32]
      list2 = [5,3,4,21,201,51,4,5,9,12,32,23]
      
      list3 = []
      
      for i in range(len(list2)):
          if list2[i] not in list1:
              pass
          else :
              list3.append(list2[i])
      print list3
      print len(list3)
      

      【讨论】:

        【解决方案5】:

        或者试试这个(没有改变列表):

        dif = 0 
        for i in range(len(min(list_1, list_2))):
            if list_1[i]!=list_2[i]:
                dif+=1
            #print(list_1[i], " != ", list_2[i], " --> Dif = ", dif)
        
        dif+=(len(max(list_1, list_2)) - len(min(list_1, list_2)))
        
        print("Difference = ", dif)
        

        (输出:Difference = 3

        【讨论】:

          【解决方案6】:

          也好不到哪里去,但这里有另一种选择

          if len(a) < len(b):
                          b = b[0:len(a)]
                      else:
                          a = a[0:len(b)]
          
                      correct = sum(a == b)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-24
            • 1970-01-01
            • 2021-11-28
            • 2014-08-21
            • 1970-01-01
            • 2018-07-03
            相关资源
            最近更新 更多