Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在python中成功地将元素添加到集合中,是否返回true?_Python_List_Function_Set_Add - Fatal编程技术网

如果在python中成功地将元素添加到集合中,是否返回true?

如果在python中成功地将元素添加到集合中,是否返回true?,python,list,function,set,add,Python,List,Function,Set,Add,据我所知,向集合添加元素不会返回任何结果。 例如: 但我不知道这个函数是如何工作的: 无论是否添加重复项,not SEVEN_add(x)始终返回true。 唯一真正的检查是看不见x,因为如果失败,它将不执行not seen\u add(x) 我的理解在这里还是我遗漏了什么 但是,在这里,not seen\u add(1)如果我添加重复或唯一的元素,则返回true。 这是令人费解的,不是这里只是做一个空检查吗?但是seen\u add()没有返回一个集来执行空检查。为什么seen\u add(2

据我所知,向
集合添加元素不会返回任何结果。
例如:

但我不知道这个函数是如何工作的:

无论是否添加重复项,not SEVEN_add(x)始终返回true。 唯一真正的检查是看不见
x
,因为如果失败,它将不执行
not seen\u add(x)

我的理解在这里还是我遗漏了什么

但是,在这里,
not seen\u add(1)
如果我添加重复或唯一的元素,则返回true。 这是令人费解的,
不是
这里只是做一个空检查吗?但是
seen\u add()
没有返回一个集来执行
空检查。为什么
seen\u add(2)
只返回
not seen\u add(1)
返回
布尔值True

>>> seen=set()
>>> seen_add=seen.add
>>> seen_add(1)
>>> seen
set([1])
>>> seen.add(2)
>>> seen
set([1, 2])
>>> not seen_add(1)
True
>>> not seen_add(4)
True

这是因为
notnone
True

正如您所发现的,
seen\u add(x)
总是返回
None

现在,
notnone
True

>>> not None
True
下文对此进行了解释:

5.1。真值测试

任何对象都可以测试真值,用于
if
while
条件,或作为下面布尔运算的操作数。以下值被认为是错误的:

  • None
  • False
由于
不可见_add(x)
始终为
True
,因此如果
,则对
的结果没有影响。它仅用于将
x
添加到
seen
的副作用

换言之,应采取以下措施:

seen_add = seen.add
return [ x for x in seq if x not in seen and not seen_add(x)]
是一种较短(可能更有效)的写作方式:

result = []
for x in seq:
  if x not in seen:
    result.append(x)
    seen.add(x)
return result

正如其他人所说,
not seen\u add(x)
的计算结果总是
True
,因此它仅用于将addition语句添加到列表中。由于
x和True
的逻辑值等于
x
,因此这不会改变
if
的行为

由于
的行为,这样做的另一件事是,只有当左侧参数为
True时,才会执行
的右侧参数。因此,对
seen.add()
的调用仅在元素尚未在集合中时完成

等效的python代码是:

def f7(seq):
    seen = set()
    result = []
    for x in seq:
        if x not in seen:
            result.append(x)
            seen.add(x)
    return result

列表理解的解决方案可能会更快,但它对我来说太神秘了。

也许这可以帮助你

def add_ok(set, value):
    return len(set) != (set.add(value), len(set))[1]


print(add_ok(a, 1))
print(add_ok(a, 1))

虽然这可行,但这是正确的方法。因为
not seen\u add(x)
总是
True
,那么为什么要在
中检查它呢?如果
@渴望学习:因为你不能把语句放在列表理解中,只能放在表达式中。也许你应该解释一下布尔测试是如何快捷的。@StevenRumbalski:我本来打算这么做的,但后来决定它与这里无关(因为如果
x
已在
seen
中,则调用
seen\u添加(x)
是不可操作的)。我有一种感觉,试图解释短路会让事情变得更糟。@NPE:谢谢,我确实知道短路。
我只是不明白为什么总是返回
真的
if
的一部分。但这仅仅是因为
列表理解需要表达式指出。并指出,
notnone
True
,这与我熟悉的Java不一样
def f7(seq):
    seen = set()
    result = []
    for x in seq:
        if x not in seen:
            result.append(x)
            seen.add(x)
    return result
def add_ok(set, value):
    return len(set) != (set.add(value), len(set))[1]


print(add_ok(a, 1))
print(add_ok(a, 1))