如果两个集合有共同数字,返回布尔值

0 投票
3 回答
751 浏览
提问于 2025-05-10 20:54

我想写一个函数,如果两个集合中有共同的数字,就返回真(true),如果没有共同的数字,就返回假(false)。

这是我目前写的代码:

def contains(set1, set2):

    set1 = [5,2,9,1,3]
    set2 = [3,8,9,1,4]

    set_of_nums1, set_of_nums2 = set(set1), set(set2)

    for i in set1:
        if i in set2:
            return True

        return False

contains (set([5,2,9,1,3]), set([3,8,9,1,4]))

这个应该可以正常工作,但我没有得到任何返回值。为什么会这样呢?

相关问题:

  • 暂无相关问题
暂无标签

3 个回答

0

这个方法非常快,因为一旦找到一个交集的元素,它就会立刻停止循环。

在最坏的情况下(如果没有交集,并且它需要遍历整个集合),时间复杂度是 O(N),这里的 N 是较小集合中的元素数量。

def any_intersection(set1: set, set2: set) -> bool:
    """
    Check if two sets have an intersection (its much more efficient than set.intersection() for big sets)

    Examples:

    >>> any_intersection({'a', 'b'}, {'c', 'd'})
    False
    >>> any_intersection({'a', 'b', 'c'}, {'c', 'd'})
    True
    """
    small_set, big_set = sorted((set1, set2), key=len)  # find the smaller set
    return any(map(big_set.__contains__, small_set))
4

要检查两个集合是否至少有一个共同的元素,可以使用内置的方法,正如@jonrsharpe在评论中提到的:

if set1.intersection(set2):
  # share an element

或者可以使用交集运算符(&

if set1 & set2:
  # share an element
4

你现在的代码缩进有问题。这样的话,代码只会在第一个集合的第一个数字在第二个集合里时返回 True。如果在循环的第一次迭代中,i不在set2里,它就会返回 True。你只需要这样修正:

def contains(set1, set2):

    set1 = [5,2,9,1,3]
    set2 = [3,8,9,1,4]

    for i in set1:
        if i in set2:
            return True

    return False

不过,正如评论中提到的,这并不是最实用的方法。

而且,你输入了两个值,但又完全覆盖了它们的原始值,这样做是没有意义的。你可以把函数声明成这样: def contains():,这样就不需要任何输入,或者你可以在使用输入值之前,删除那两行改变set1和set2值的代码。

撰写回答