基于项目条件,在两个列表中查找索引

7
假设我有两个列表。它们都是书籍评分的列表,评分范围从-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,我希望能够找到所有发生这种情况的不同索引。

如果有点困惑,请见谅,但我实在不知道该怎么说得更清楚。

5个回答

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

7

另一种变体:

>>> [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]

1
这可能是我会做的事情。我喜欢它将两个列表元素类似地处理(不像 v vs list2[i]),但对索引 i 和元素 l1l2 进行了一些不同的处理,因此语法符合语义。 - DSM

4
>>>idx_list = [i for i in range(len(list1)) if list1[i] > 1 and list2[i] == 0]

我更喜欢这个,因为它不会创建中间变量 - 过滤器中的比较是直接的(list1list2都在那里),更容易跟踪。没有必要扫描该行以查看如何定义v - Izkata

2
我认为这样更易读。
>>> 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 文档


1
+1 但是为什么要使用 count(0) 而不是 count() 呢?此外,我认为这是最好的解决方案。 - jamylak
@jamylak: 可读性。我也会在我的代码中使用这个 :) - Rik Poggi
实际上回过头来看,我认为我更愿意做[i for i,(x,y) in enumerate(izip(list1,list2)) if x>=1 and y==0]而不是使用计数进行压缩。 - jamylak

2
使用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

可能是这样,但我总是喜欢把它看作是对布尔数组进行向量算术运算。但让人们知道两种选项都存在是很好的。 - ely
想一想,== True 是不必要的,对吧? - DSM
是的,完全正确。这是一个重要的更改。已修复。 - ely

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接