如果两个集合有共同数字,返回布尔值
我想写一个函数,如果两个集合中有共同的数字,就返回真(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值的代码。