【问题标题】:Find indexes on two lists based on items condition根据项目条件在两个列表上查找索引
【发布时间】:2025-12-29 04:35:10
【问题描述】:

假设我有两个列表。它们是从 -5 到 5 的图书评级列表。

我想知道list1的元素是>= 1,list2的元素是== 0,比如。

list1 = [3, 3, 1, 0, 3, 0, 3, 0, 0, -3, 0, 5, 3, 0, 1, 0, 0, 5, 3, 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 0, 3, 5, 3, 3, 0, 0, 0, 5, 0, 5, 0, 3, 3, 0, -3, 0, 0, 5, 1, 5, 3, 0, 3, 0, 0]
list2 = [5, 0, 0, 0, 0, 0, 5, 0, 0, 1, 0, 5, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 5, 5, 5, 3, 0, 0, 0, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 0, 5, 3, 0, 0, 0, 0]

list1[1] = 3list2[1] = 0,我希望能够找到发生这种情况的所有不同索引。

对不起,如果这令人困惑,但我真的不知道该怎么说。

【问题讨论】:

    标签: python list data-structures indexing


    【解决方案1】:
    >>> [i for i, v in enumerate(list1) if v>=1 and list2[i]==0]
    [1, 2, 4, 14, 18, 27, 39, 48, 52]
    

    【讨论】:

      【解决方案2】:
      >>>idx_list = [i for i in range(len(list1)) if list1[i] > 1 and list2[i] == 0]
      

      【讨论】:

      • 我更喜欢这个,因为它不会创建中间变量 - 过滤器中的比较是直接的(list1list2 都在那里),并且更容易在心理上跟踪。没有v,您必须扫描该行以查看它是如何定义的。
      【解决方案3】:

      我发现这更具可读性。

      >>> from itertools import count
      >>> [i for i,one,two in zip(count(0), list1, list2) if one >= 1 and two == 0]
      [1, 2, 4, 14, 18, 27, 39, 48, 52]
      

      这是itertools.count doc

      【讨论】:

      • +1 但为什么有count(0) 而不仅仅是count()?我也发现这是最好的解决方案。
      • @jamylak:可读性。我也是,我会在我的代码中使用这个:)
      • 实际上回想起来我想我宁愿做[i for i,(x,y) in enumerate(izip(list1,list2)) if x>=1 and y==0]而不是压缩计数。
      【解决方案4】:

      另一种变体:

      >>> [i for i, (l1, l2) in enumerate(zip(list1, list2)) if l1 >= 1 and l2 == 0]
      [1, 2, 4, 14, 18, 27, 39, 48, 52]
      

      【讨论】:

      • 这可能是我所做的。我喜欢它对两个列表元素的处理方式相似(与vlist2[i] 不同),但对索引i 和元素l1,l2 的处理方式略有不同,因此语法符合语义.
      【解决方案5】:

      使用 NumPy 数组,这可以通过逻辑索引实现:

       import numpy as np
       list1 = np.array([1, -1, 0, 0, 1])
       list2 = np.array([0, 5, 0, 0, 0])
      
       # Option 1, multiply the logicals together.
       inds = np.where( (list1 >= 1)*(list2 == 0) )[0]
      
       # Option 2, pure logicals.
       inds = np.where( (list1 >= 1) & (list2 == 0) )[0]
      

      现在inds[0] = 0inds[1] = 4

      【讨论】:

      • 可能是这样,但我总是喜欢将其视为布尔数组上的向量算术。但最好确保人们知道这两种选择都存在。
      • 仔细想想,== True 是不必要的,不是吗?
      • 是的,完全可以。这是一个重要的变化。固定。