Python 列表交集的索引

Python 列表交集的索引,python,list,Python,List,给定两个长度相等的列表: _list = [1, 4, 8, 7, 3, 15, 5, 0, 6] _list2 = [7, 4, 0, 1, 5, 5, 7, 2, 2] 如何尝试获得如下输出: 输出=[0,3,1,1,3,0,6,4,6,5,7,2] 这里获得两个列表的交集,公共元素的索引排列在列表中: 输出=元素在_列表中的索引列表,它出现在_列表2中 尝试与集合相交不是一个选项,因为集合将删除重复元素。基本中间:作为生成器: def find_matching_indices(a, b

给定两个长度相等的列表:

_list = [1, 4, 8, 7, 3, 15, 5, 0, 6]
_list2 = [7, 4, 0, 1, 5, 5, 7, 2, 2]
如何尝试获得如下输出:

输出=[0,3,1,1,3,0,6,4,6,5,7,2]

这里获得两个列表的交集,公共元素的索引排列在列表中:

输出=元素在_列表中的索引列表,它出现在_列表2中

尝试与集合相交不是一个选项,因为集合将删除重复元素。

基本中间:作为生成器:

def find_matching_indices(a, b):
    for i, x in enumerate(a):
        for j, y in enumerate(b):
            if x == y:
                yield i, j

list(find_matching_indices(list1_, list2_))
# [(0, 3), (1, 1), (3, 0), (3, 6), (6, 4), (6, 5), (7, 2)] 
基本中级:作为列表理解:

[(i, j)  for i, x in enumerate(list1_) for j, y in enumerate(list2_) if x == y]
# [(0, 3), (1, 1), (3, 0), (3, 6), (6, 4), (6, 5), (7, 2)] 
这些解决方案涉及两个循环

中级高级:为了好玩,字典是您可以考虑的另一种数据结构:

import collections as ct

import more_itertools as mit


def locate_indices(a, b):
    """Return a dictionary of `a` index keys found at `b` indices."""
    dd = ct.defaultdict(list)
    for i, y in enumerate(a):
        idxs = list(mit.locate(b, lambda z: z == y))
        if idxs: dd[i].extend(idxs)
    return dd


locate_indices(list1_, list2_)
# defaultdict(list, {0: [3], 1: [1], 3: [0, 6], 6: [4, 5], 7: [2]})
注意列表a的索引是字典中的键。附加列表b中共享相同值的所有索引

之所以使用A,是因为它有助于使用列表值构建词典。有关的更多信息,它只生成满足lambda条件的所有索引-列表a中的一项也可以在b中找到。

基本中间:作为生成器:

def find_matching_indices(a, b):
    for i, x in enumerate(a):
        for j, y in enumerate(b):
            if x == y:
                yield i, j

list(find_matching_indices(list1_, list2_))
# [(0, 3), (1, 1), (3, 0), (3, 6), (6, 4), (6, 5), (7, 2)] 
基本中级:作为列表理解:

[(i, j)  for i, x in enumerate(list1_) for j, y in enumerate(list2_) if x == y]
# [(0, 3), (1, 1), (3, 0), (3, 6), (6, 4), (6, 5), (7, 2)] 
这些解决方案涉及两个循环

中级高级:为了好玩,字典是您可以考虑的另一种数据结构:

import collections as ct

import more_itertools as mit


def locate_indices(a, b):
    """Return a dictionary of `a` index keys found at `b` indices."""
    dd = ct.defaultdict(list)
    for i, y in enumerate(a):
        idxs = list(mit.locate(b, lambda z: z == y))
        if idxs: dd[i].extend(idxs)
    return dd


locate_indices(list1_, list2_)
# defaultdict(list, {0: [3], 1: [1], 3: [0, 6], 6: [4, 5], 7: [2]})
注意列表a的索引是字典中的键。附加列表b中共享相同值的所有索引

之所以使用A,是因为它有助于使用列表值构建词典。请参阅关于的更多信息,它只生成满足lambda条件的所有索引-列表a中的一项也可以在b中找到

此解决方案构建一个字典,用于跟踪值在输入列表中出现的索引。因此,如果值5出现在第一个列表的索引0和2以及第二个列表的索引3处,那么字典中5的值将是[0,2],[3]

然后,它使用itertools.product构建这些索引的所有组合

这看起来比这里的其他答案更复杂,但因为它是Onlogn而不是在**2上,特别是对于大输入。使用上述算法,两个长度为1000的随机数列表(0-1000)在约0.4秒内完成100个测试,使用其他一些算法,则在6-13秒内完成100个测试

此解决方案构建一个字典,用于跟踪值在输入列表中出现的索引。因此,如果值5出现在第一个列表的索引0和2以及第二个列表的索引3处,那么字典中5的值将是[0,2],[3]

然后,它使用itertools.product构建这些索引的所有组合


这看起来比这里的其他答案更复杂,但因为它是Onlogn而不是在**2上,特别是对于大输入。两个长度为1000的随机数列表0-1000使用上述算法在约0.4秒内完成100个测试,使用其他一些算法在6-13秒内完成100个测试


以下是在日志n上运行的解决方案:


您的两个列表中的元素是否唯一?@ChihebNexus不在示例输入中不缺少1,1?您确定输出应该是[0,3,2,2,3,0,6,4,6,5,7,2]吗?如果有重复项,你应该使用哪个索引?对不起,2,2应该是1,1。谢谢你指出。你的两个列表中的元素是唯一的吗?@ChihebNexus不在示例输入中,但不缺少1,1?你确定输出应该是[0,3,2,2,3,0,6,4,6,5,7,2]吗?如果有重复项,你应该使用哪个索引?对不起,2,2应该是1,1。谢谢你指出这一点。