在python中如何在两个集合的交集中添加重复项

在python中如何在两个集合的交集中添加重复项,python,set,Python,Set,假设我有两套 a = {1,2,3,4} b = {2,2,5,7,3,3} 所以当我取这两个集合的交集时,我也希望结果中有重复项 c = a.intersection(b) print (c) {2,2,3,3} 正如@mohitolanki所指出的,sets不是适合您的用例的正确数据结构,因为它们不能包含重复项。 因此,b={2,2,5,7,3,3}将在访问变量b时打印{2,5,7,3},这可能不是您想要的 我可以建议使用lists吗?可能的解决方案如下所示: def intersect

假设我有两套

a = {1,2,3,4}
b = {2,2,5,7,3,3}
所以当我取这两个集合的交集时,我也希望结果中有重复项

c = a.intersection(b)
print (c)
{2,2,3,3}

正如@mohitolanki所指出的,
set
s不是适合您的用例的正确数据结构,因为它们不能包含重复项。 因此,
b={2,2,5,7,3,3}
将在访问变量
b
时打印
{2,5,7,3}
,这可能不是您想要的

我可以建议使用
list
s吗?可能的解决方案如下所示:

def intersection(x: list, y: list):
    s = set(y)
    return [v for v in x if v in s]

a = [1,2,3,4]
b = [2,2,5,7,3,3]
print(intersection(a, b))
print(intersection(b, a))


''' Output:
print(intersection(a, b)) -> [2, 3]
print(intersection(b, a)) -> [2, 2, 3, 3]
'''
你对我的解决方案有什么问题吗?此外,请让我/我们知道这个答案是否对您有帮助!如果不是,请向我/我们提供更多反馈。干杯:-)


编辑将用户@Jean Françoisfare的反馈纳入其中,以将搜索复杂性(imho)提高一个常数→ <通过引入
s=set(y)
并在
交叉点中执行
s中的
v
方法,使用
n=len(y)
c=len(y)-len(set(y))
,编码>O(n-c)
。谢谢你指出这一点!当第二个参数包含大量重复项时,这一点特别有用。

首先,如果定义这样的集合,将立即丢失重复的元素。因此,请定义列表:

a = [1,2,3,4]
b = [2,2,5,7,3,3]
现在我的建议是:使用集合对列表中的元素进行计数。计数器
,求交并取最大计数,然后展开计数器:

import collections

c1 = collections.Counter(a)
c2 = collections.Counter(b)

c3 = collections.Counter({k:max(c1[k],c2[k]) for k in set(a).intersection(b)})

print(list(c3.elements()))
结果:

[2, 2, 3, 3]

一个
集合
不能包含重复项,这就是它们的要点

因此,要扩展您的代码:

>>> a = {1,2,3,4}
>>> b = {2,2,5,7,3,3}
>>> a
{1, 2, 3, 4}
>>> b
{2, 3, 5, 7}
请注意,
b
中的重复项已作为
集合的一部分自动删除

因此,首先必须将变量
a
b
重新定义为列表:

a = [1,2,3,4]
b = [2,2,5,7,3,3]  

然后我想你的问题的答案是:

你能给出一个你想要的输出的例子吗?
set
不能有重复的项目。定义
b={2,2,5,7,3,3}
b将只包含
{2,3,5,7}
更好地使用
list
输出中出现次数的规则是什么?您真的希望
2
在输出中出现两次,即使它在
a
中只出现一次吗?@PM2Ring:这似乎与标记的副本不太一样;这将给出
[2,3]
的交叉点,而不是
[2,2,3,3]
。我仍在试图弄清楚OP在这里使用的规则是什么;让·弗朗索瓦·法布明白,这不是通常的多集交叉路口。但在OP澄清之前,我们不需要猜测实际需求的人给出更多答案它很好,因为它很简单。唯一的缺点是线性搜索(
if v in y
)。此外,还应避免最后一部分(提问)。这意味着,如果人们发表评论,他们会发表评论。改进你的答案:
s=set(y);return[v表示v在x中,如果v在s中]
现在已经摆脱了线性搜索nice catch@Jean franoisfabre!谢谢,我将编辑我的帖子!在这种情况下,将标记为重复项,而不是提供链接。好吧,你提供的链接没有给出OP想要的结果。