【问题标题】:Detect where elements of two lists differ from one another according to their index根据索引检测两个列表的元素在哪里不同
【发布时间】:2022-01-07 13:23:54
【问题描述】:

鉴于这两个列表

l1=[0,0,0,0,1,1,1,1]
l2=[0,0,0,1,1,1,1,1]

除了第 4 个元素外,它们是相同的。我需要一个代码来检测这两组之间的差异并打印出检测到的差异的位置。在这种情况下,它将 = 4。 intersectionunion 命令不起作用,因为它们没有考虑索引。

我试过这段代码,但它没有打印出任何东西:

l1=[0,0,0,0,1,1,1,1]
l2=[0,0,0,1,1,1,1,1]

for i in l1:
    if i != l2[l1.index(i)]:
        print(l1.index(i),i)

【问题讨论】:

  • 你的意思是你需要编写代码来做到这一点。
  • 函数zip会对此有所帮助。
  • 我刚刚编辑了它。起初我没有包含任何其他内容,因为我的代码根本没有打印出任何内容

标签: python list list-comparison


【解决方案1】:
l1=[0,0,0,0,1,1,1,1]
l2=[0,0,0,1,1,1,1,1]
print(l1.index(l1 != l2))

第三行返回不满足条件l1不等于l2的l1的索引位置。

【讨论】:

  • 这不起作用 - 它返回 4 因为您正在寻找 Truel1 中的索引 - python 中的布尔值是整数,而 True 是 1 - 第一个 1 值l1 在索引 4(第 5 个值)上 - 第一个区别在索引 3(第 4 个值)上。程序不需要因为错误而剧烈崩溃。
【解决方案2】:

您的代码不起作用,因为list.index(value [, pos]) 仅报告该列表中值的第一次出现 [在pos 之后]。

这将报告差异:

l1=[0,0,0,0,1,1,1,1]
l2=[0,0,0,1,1,1,1,1]
print(*(p for p,v in enumerate(zip(l1,l2)) if v[0]^v[1]))

输出:

3

zip(..) 将值按位置配对到元组中,enumerate(..) 获得 index, tuple 值,v[0]^v[1] 是一个逻辑异或,仅当值至少相差 1 位时才为真。

见:


这个更简单的版本没有 zip:

for index,number in enumerate(l1): # get index & number of one list
    if l2[index] != number:        # compare to other number
        print(f"On {index}: {number} != {l2[index]}")

【讨论】:

    【解决方案3】:

    你可以使用 zip

    l1=[0,0,0,0,1,1,1,1]
    l2=[0,0,0,1,1,1,1,1]
    
    diff_idx = [idx for idx,(x,y) in enumerate(zip(l1,l2)) if x != y]
    print(diff_idx)
    

    输出

    [3]
    

    【讨论】:

      【解决方案4】:
      output = [idx for idx,(i,j) in enumerate(zip(l1,l2), start=1) if i!=j]
      print(output) # [4]
      

      或者你可以这样做:

      for i in range(len(l1)):
          if l1[i] != l2[i]:
              print(i+1)
      

      这更接近你写的。

      【讨论】:

        猜你喜欢
        • 2021-05-13
        • 2017-12-12
        • 1970-01-01
        • 2017-04-18
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多