我想得到一个没有消除重复的列表的交集。 我希望该方法是一种不使用循环的快速方法。 下面是我的尝试,但是这个方法失败了,因为重复项被删除了。
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
当然,在性能优化中,唯一真正的方法是在真实系统上使用真实数据进行尝试和测量……随着技术的进步和变得越来越复杂,猜测的作用越来越小。
