在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想要的结果。