python - 如何查找列表A中也在列表B中的项目的索引

标签 python

我有 listA,其中包含

[0, 20, 40, 60, 80, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320, 340]

listB,其中包含

[87, 78343, 100, 38, 100, 20, 80]

我希望能够找到 listA 中的数字索引,这些数字也在 listB 中。

例如,listAlistB共享100、100、20和80。这些整数在listA中的索引是

[6, 6, 1, 4, 5]

是否有一个流程可以为我找到这个,这样我就不必手动完成它?

这类似于 this question 。不同之处在于,即使索引在任一列表中多次出现,我也必须知道索引,而该链接的答案仅适用于实例的第一个示例:即 listB 中的 80 位于 [ listA 上的 4] 和 [5],但所描述的方法只会返回 [4]。

最佳答案

创建一个字典来保存包括重复元素在内的所有索引,然后使用列表组合为常见元素添加索引:

from collections import defaultdict

d = defaultdict(list)

for i, ele in enumerate(A):
    d[ele].append(i)

print([ele for i in B  for ele in d[i] if i in d])
[6, 6, 1, 4, 5]

如果我们再添加几个 80,您可以看到它返回所有适当的索引:

A = [0, 20, 40, 60, 80, 80, 100, 80, 120, 80,140, 160, 180, 200, 220, 240, 260, 280, 300, 320, 340,21]


B = [87, 78343, 100, 38, 100, 20, 80]

from collections import defaultdict

d = defaultdict(list)

for i, ele in enumerate(A):
    d[ele].append(i)

print([ele for i in B for ele in d[i] if i in d])
[6, 6, 1, 4, 5, 7, 9, 21]

对于大型列表,这将非常有效,查找和 0(1) 因此构建字典的成本将被抵消任何合理大小的数据和良好的扩展。

有一点尚不清楚,例如,如果两个列表中都有重复的条目,会发生什么情况:

A = [1, 2, 2, 3, 3, 4, 5] 
B = [3, 4, 3, 5]

变成:

[3, 4, 5 3, 4, 6]

其中 3,4 出现两次,因为 3 在两者中都重复。

如果是这种情况,您也可以保留 b 中元素的计数:

from collections import defaultdict, Counter

d = defaultdict(list)
for i, ele in enumerate(A):
    d[ele].append(i)

cn = Counter(B)
l = []
for i in B:
    if i in d:
        val = d[i]
        l.extend(val.pop(0) if len(val) > 1 and cn[i] > 1 else ele for ele in val)
print(l)
[3, 5, 4, 6]

但是如果项目在 B 中出现 3 次,您将获得 A 中最后一次出现的索引的第一个值:

 A = [1, 2, 2, 3, 3, 4, 5]
 B = [3, 4, 3, 5, 3]
 [3, 5, 4, 6, 4]

关于python - 如何查找列表A中也在列表B中的项目的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855595/

相关文章:

python - 在没有root权限的情况下安装python包

具有多个 'for' 子句和单个 'if' 的 python 理解

python - Pandas - 获取分组数据的最新 'n' 列值

python - 无法使用 urllib2 从 Web 保存图像

python - 在循环内使用 repl_python()

python - Pandas groupby 抛出 : TypeError: unhashable type: 'numpy.ndarray'

python - 如何使用 Python 将文件格式从 Unicode 转换为 ASCII?

python - 将 Flask 应用程序部署到 heroku 会导致 create_app() 出现 500 错误

Python Docker 远程调试 VS Code

python - 不能将部分用作 __str__