找出是否有两个集合具有相同的成员资格

2024-09-28 23:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有六套,名为s1。。。s6,每个都有几百个字符串元素

我想测试它们中是否有任何一个具有与其他任何元素相同的元素集。我该怎么设置呢

值得一提的是,我从这里开始,试图打印一个罪犯的索引:

setlist = [s1, s2, s3, s4, s5, s6]

for i in range(len(setlist)):
    if any([setlist[i] == st for st in setlist[i+1:]]):
        print('You have redundant sets: %i' % i)

为了澄清,s1-s6均为set()类型。我需要能够看到哪些匹配,例如,如果s2和s3恰好有相同的成员,我希望看到'You have redundant sets: s2, s3'显然,我的起始代码不会让我达到目的


Tags: 字符串inyou元素fors3havesets
3条回答

如果您想找到所有具有共同元素的集合对,这应该会有所帮助。您将希望使用内置的set函数,而不是进行元素比较

have_overlap = list()
setlist = [s1, s2, s3, s4, s5]
for ix1,s in enumerate(setlist):
  for ix2 in range(ix+1, len(setlist)):
    if s.symmetric_difference(setlist [ix2]):
      have_overlap.append(ix, ix2)
    s1={1,2,3}
    s2={2,3,4}
    s3={1,2,3}
    s4={1,2,3}
    s5={2,6,7}
    setlist = [s1, s2, s3, s4,s5]
    redundantSet=set()
    for i in range(len(setlist)):
        for j in range(i+1,len(setlist)):
            if(setlist[i]==setlist[j]):
                if(i==0):
                    redundantSet.add(i)
                redundantSet.add(j)
    print('You have redundant sets at index' + str(redundantSet))

不能使用任何()函数来等值,因为任何()只接受列表,即使列表中有一个元素,也会返回true。即使这样做

any[(setlist[i+1:],setlist[i])

将返回true,因为“setlist[i]”元素将在那里。因此,将返回true

一种解决方案可能是使用集合内置数据结构并比较每个集合。为此,你可以把你所有的集合放进一本字典,并给出(1,2,3,5,6)键。 要获得用于比较的所有排列,您可以使用itertools.product,例如:

import itertools
sets_1 = range(1,7)
sets_2 = range(1,7)
perms = list(filter(lambda x: x!=0, [(a,b) if a!= b else 0 for (a, b) in list(itertools.product(*[sets_1, sets_2]))]))

通过使用perms,您可以执行以下操作:

sets_dict= {1:{2,3}, 2:{5,6}, 3:{7,8}, 4:{5,9}, 5:{10,22}, 6:{22,4}}
for (set_1, set_2) in perms:
    print(sets_dict[set_1] & sets_dict[set_2]) 

或者,如果您的集合太大,您可以循环遍历每个集合并填写字典,其中键是集合成员,值是承载它们的集合

相关问题 更多 >