在Python位置的列表之间匹配元素

2024-05-08 07:26:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子,都很长。列表A包含一个整数列表,其中一些整数在列表B中重复出现。我可以通过以下方法找到出现在这两个列表中的元素:

idx = set(list_A).intersection(list_B)

这将返回列表a和列表B中出现的所有元素的集合

但是,我想找到一种方法来查找两个列表之间的匹配,并保留有关元素在两个列表中的位置的信息。这样的函数可能看起来像:

def match_lists(list_A,list_B):
.
.
.
return match_A,match_B

其中match\u A将包含列表\u A中元素的位置,这些元素在列表\u B中的某个位置有匹配项,反之亦然。 我可以看到如何使用for循环来构造这样的列表,但是对于长列表来说,这样做的速度会非常慢。你知道吗

关于重复项:列表\u B中没有重复项,如果列表\u a中有重复项,则返回所有匹配的位置作为列表,因此匹配\u a将是列表的列表。你知道吗


Tags: 方法函数信息元素列表returndefmatch
3条回答

这应该能完成任务:)

def match_list(list_A, list_B):
    intersect = set(list_A).intersection(list_B)
    interPosA = [[i for i, x in enumerate(list_A) if x == dup] for dup in intersect]
    interPosB = [i for i, x in enumerate(list_B) if x in intersect]
    return interPosA, interPosB

(感谢机器渴望复制编辑)

这个怎么样:

def match_lists(list_A, list_B):
    idx = set(list_A).intersection(list_B)
    A_indexes = []
    for i, element in enumerate(list_A):
        if element in idx:
            A_indexes.append(i)
    B_indexes = []
    for i, element in enumerate(list_B):
        if element in idx:
            B_indexes.append(i)
    return A_indexes, B_indexes

使用dictdefaultdict将唯一值存储为映射到它们出现的索引的键,然后组合dicts

from collections import defaultdict

def make_offset_dict(it):
    ret = defaultdict(list)  # Or set, the values are unique indices either way
    for i, x in enumerate(it):
        ret[x].append(i)

dictA = make_offset_dict(A)
dictB = make_offset_dict(B)
for k in dictA.viewkeys() & dictB.viewkeys():  # Plain .keys() on Py3
    print(k, dictA[k], dictB[k])

这种方法每次只迭代AB一次,因此即使它们是一次性使用的迭代器(例如来自类似文件的对象),也能有效地工作,存储的数据不会超过需要,并且坚持使用廉价的基于哈希的操作,而不是重复迭代。你知道吗

这不是您特定问题的解决方案,但它保留了解决您的问题所需的所有信息,然后保留了一些信息(例如,在AB中找出任何给定值的匹配位置是很便宜的);您可以根据您的用例或更复杂的用例对其进行简单的调整。你知道吗

相关问题 更多 >

    热门问题