Skip to main content
 首页 » 编程设计

python之是否可以提取包含重复值的交集列表

2025年05月04日13lyj

我想得到一个没有消除重复的列表的交集。 我希望该方法是一种不使用循环的快速方法。 下面是我的尝试,但是这个方法失败了,因为重复项被删除了。

a = ['a','b','c','f'] 
b = ['a','b','b','o','k'] 
 
tmp = list(set(a) & set(b)) 
>>>tmp 
>>>['b','a'] 

我希望结果为 ['a', 'b', 'b']。

在该方法中,'a'为固定值,'b'为可变值。

以及从'b'中提取'a'值的概念。

有没有办法提取不去除重复值的交叉值列表?

请您参考如下方法:

一个解决方案可能是

good = set(a) 
result = [x for x in b if x in good] 

这里有两个循环;一个是 set 的集合构建循环(用 C 实现,比 Python 快一百倍)另一个是理解并在解释器中运行。 第一个循环是为了避免在 a 中对 b 的每个元素进行线性搜索(如果 a 变大,这可能是一个严重的问题) .

请注意,使用 filter 可能不会获得太多(如果有的话),因为尽管 filter 循环在 C 中,但对于每个元素,它都必须获得返回给解释器调用过滤函数。

请注意,如果您关心速度,那么 Python 可能不是一个好的选择...例如,PyPy 在这里可能会更好,在这种情况下,只需显式编写最佳算法就可以了(避免重新搜索 a 用于在 b 中连续出现的重复项,就像您的示例中发生的那样)

good = set(a) 
res = [] 
i = 0 
while i < len(b): 
    x = b[i] 
    if x in good: 
        while i < len(b) and b[i] == x:  # is? 
            res.append(x) 
            i += 1 
    else: 
        i += 1 

当然,在性能优化中,唯一真正的方法是在真实系统上使用真实数据进行尝试和测量……随着技术的进步和变得越来越复杂,猜测的作用越来越小。