【问题标题】:to find a set (having copies of elements) is a subset of a bigger set in python找到一个集合(具有元素的副本)是python中更大集合的子集
【发布时间】:2020-02-12 20:29:39
【问题描述】:

我有 2 套 a=[3,4,5,5] b=[3,4,5,6,7,8,9] 我们必须找出a是否是b的子集?

a=[3,4,5,5] 
b=[3,4,5,6,7,8,9]
if(set(a).issubset(set(b))): 
    print('yes')
else:
    print('no')

此代码打印 yes,因为它忽略了元素的副本,例如:它认为 5 在 set 'a' 中仅出现一次

我希望答案是“否”,因为 b 只有一个 5。

【问题讨论】:

  • 5 在集合a中只出现一次
  • 不,5 在 set a 中出现了两次。设置 a = [3,4,5,5]
  • 列表不是集合。
  • 集合不允许重复
  • 我的意思是仅列出

标签: python set subset


【解决方案1】:

如果您必须在没有库的情况下执行此操作并且您的列表已排序,您可以使用迭代器执行匹配。当值相同时,推进第二组,同时推进第一组。如果您通过所有列表(使用迭代器),您将知道第一个列表是第二个列表的子集

def isSubset(setA,setB):
    iterA  = iter(setA)
    valueA = next(iterA,None)
    for valueB in setB:
        if valueA == valueB:
            valueA = next(iterA,None)
    return valueA is None

a=[3,4,5,5] 
b=[3,4,5,6,7,8,9]
print(isSubset(a,b)) # False

c=[3,4,5,5,5,6,7,8,9]
print(isSubset(a,c)) # True  

d=[3,4,5,5,5,6,7]
print(isSubset(b,d)) # False  

如果列表不能保证排序,您可以在函数开头添加:

setA,setB = sorted(setA),sorted(setB)

如果你想让这个更快,你可以添加一个条件,在到达 setA 的末尾或当 set B 中的值大于 set A 的当前值时退出循环:

# at beginning of for loop:
if valueA is None or valueB > valueA: break

【讨论】:

    【解决方案2】:

    使用collections.Counter

    all(v >= 0 for v in (Counter(b) - Counter(a)).values())
    

    如果 a 是 b 的子包,则为 True。

    【讨论】:

    • 或者只是not Counter(a) - Counter(b)
    【解决方案3】:

    5 在 a 中出现了两次,但在 set(a) 中出现了一次。 set(a)=(3,4,5)set(b)=(3,4,5,6,7,8,9),所以答案是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2011-05-23
      相关资源
      最近更新 更多