如果在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))