我有 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
中。
例如,listA
和listB
共享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/