【发布时间】:2015-04-24 03:27:25
【问题描述】:
我想有效地找到两个列表的交集,保留 both 的重复项,例如A=[1,1,2,3], B=[1,1,2,4] 应该返回 [1,1,1,1,2]
我知道之前有人问过类似的问题 (Python intersection of two lists keeping duplicates) 但这对我没有帮助,因为只保留一个列表中的重复项。
以下作品
def intersect(A,B):
C=[]
for a in A:
for b in B:
if a==b:
C.append(a)
return C
但是对于我正在做的事情来说效率不够!为了加快速度,我尝试对列表进行排序
def intersect(A,B):
A.sort()
B.sort()
C=[]
i=0
j=0
while i<len(A) and j<len(B):
if A[i]<=B[j]:
if A[i]==B[j]:
C.append(A[i])
i+=1
else:
j=j+1
return C
但是这只会保留列表 B 中的重复项。有什么建议吗?
【问题讨论】:
-
只是为了澄清“列表的交集”在这里你的意思是“如果一个项目在列表 A 中出现 N 次,在列表 B 中出现 M 次,它应该在新列表中出现 N+M 次,但如果 N 或 M 为零,那么它应该在新列表中出现零次”? (这是“交叉点”一词的不寻常用法。)
-
结果中有4个
1,因为A中有2个,B中有2个,那么为什么结果没有两个2s? -
根据您的数据,我意识到我的上述解释是不正确的。为什么示例结果中只有一个 2,却有四个 1?
-
之所以有四个 1,是因为列表 A 中的每个 1 都与列表 B 中的 1 匹配,而列表 A 中的 2 与列表 B 中的 2 唯一匹配。另一个例子是A=[1,1,2,3], B=[1,2,4] 应该返回 [1,1,2]
-
您是在处理大型列表,还是在处理小型列表但有很多交叉点?你的列表中有很多重复的元素吗?请举一些当时的例子。
标签: python list duplicates intersection