将交集设为无

时间:2018-08-29 14:18:45

标签: python set intersection nonetype operation

我在设置操作交叉点时遇到麻烦。

假设我有一个列表A = [0,1,2,3]和一个整数B = 0。当我检查if B in A:时,我当然会得到True

但是,当AB默认等于None时,我将无法进行AB的相交运算。 / p>

我正在寻找一种不会出错的跟踪方式:

A = None
B = None

if B in A:
    raise KeyError('B in A')

通常A是python列表,而B是字符串。但是我需要将它们默认设置为None,而它们是我函数中的参数。它们必须具有None的值。

PS:使用搜索算法获取TrueFalse。并不重要。我只需要获取TrueFalse,就可以安排我的错误提出了。

6 个答案:

答案 0 :(得分:1)

为什么不尝试检查A或B本身是否为None?

A = None
B = None

if None not in [A, B] and B in A:
    print('B in A')
else:
    print('B or A is None, or B is not in A')

答案 1 :(得分:1)

最简单的方法是设置A = []而不是A = None(这对于最终将成为列表的东西来说是一个合理的值)。

如果A是函数的参数,请注意不要写

def f(A=[])

但是,相反

def f(A=None):
    if A is None:
       A = []

答案 2 :(得分:1)

您可以尝试:

if B in (A or []):

因此,如果ANone,它将针对空白列表进行测试并产生False

如果A是一个空列表,它还将针对or的最右边操作数进行测试,但结果将相同。

更大的范围:如果函数中的默认值为None

def foo(A=None,B=None):

将其保留为None,然后在函数代码中进行更改,以使默认参数不可变("Least Astonishment" and the Mutable Default Argument)。

if A is None:
   A = []

答案 3 :(得分:1)

继续使用None作为默认参数,然后将a设置为空集set(如果它是None(我使用小写的参数名称作为按照python约定):

def f(a=None, b=None):
   if a is None:
       a = set()

    if b in a:
        raise KeyError('b in a')

    if a.isdisjoint(other_set):
       ...

答案 4 :(得分:0)

A = [None, 1, 2]
B = None

if B in A: # where A should be a list, it should be iterable
    print('done')

输出

done

答案 5 :(得分:0)

在函数中处理None初始化参数的通常方法是在所述函数开始时将它们分配为合理的默认值。我使用类型注释只是为了显示可以传递哪种类型的值:

from typing import List, Optional

def check_intersect(A: Optional[List[str]] = None, B: Optional[str] = None):
    if A is None:
        A = []
    if B in A:  # this can't fail any more 
        raise KeyError('B in A')

in关键字(如果它当然不是for循环的一部分。)要求使用python对象作为offers a __contains__()函数的右侧参数,其中None没有。