set.intersection 和其他人的文档?
Documentation for set.intersection and others?
最近需要求一组集合的交集,即S1∩S2∩...∩ Python 中的 Sn。我在 Best way to find the intersection of multiple sets? 找到了一个非常有趣的答案,所以我的代码解决方案是:
s1, s2, s3 = set("abc"), set("cde"), set("acf")
list_of_sets = [s1, s2, s3]
result = set.intersection(*list_of_sets) # {'c'}
我很惊讶地看到 .intersection()
调用了 set
class 而不是 set
对象。
我的问题是我在哪里可以看到这方面的文档?
上面链接的 Whosebug 回答说
Note that set.intersection is not a static method, but this uses the functional notation to apply intersection of the first set with the rest of the list. So if the argument list is empty this will fail.
但官方文档似乎没有描述这一点:intersection(*others)
。搜索“python set functional notation”似乎也无济于事。官方文档描述了我的期望,即在 set
对象上使用 .intersection()
,例如
result = s1.intersection(*[s2, s3])
我也很想知道可以以同样的方式使用其他数据结构中的哪些其他方法。
我认为它只是 set.itersection(*others)
实现方式的一个(未记录的)工件,因此应该适用于任何其他 classes,其方法支持可变数量的 other
对象。
为了说明和证明我的观点,这里有一个自定义 class 通过它自己的 intersection()
方法支持这种所谓的“函数式表示法”。
class Class:
def __init__(self, value=''):
self.value = str(value)
self.type = type(value)
pass
def __repr__(self):
return f'Class({self.type(self.value)!r})'
def intersection(self, *others):
result = self
for other in others:
result &= other # Perform via __and__() method.
return result
def __and__(self, other):
return type(self)('|'.join((self.value, other.value)))
c1 = Class('foo')
c2 = Class('bar')
c3 = Class(42)
print(f'c1: {c1}')
print(f'c2: {c2}')
print(f'c3: {c3}')
# Both produce the same result.
print(c1 & c2 & c3)
print(Class.intersection(c1, c2, c3))
输出
c1: Class('foo')
c2: Class('bar')
c3: Class(42)
Class('foo|bar|42')
Class('foo|bar|42')
除了martineau answer,像obj1.method1(...)
这样通过class实例调用的方法也可以用obj1_class.method1(obj1, ...)
调用,在C实现代码中我只看到假设第一个参数是一个集合。当你解压缩 others
时也会发生这种情况,这是一个集合列表。
也许它在方法帮助中没有记录,但无论如何都应该是预期的。
所以我也同意
and therefore should apply to any other classes with methods that support a variable number of other objects.
最近需要求一组集合的交集,即S1∩S2∩...∩ Python 中的 Sn。我在 Best way to find the intersection of multiple sets? 找到了一个非常有趣的答案,所以我的代码解决方案是:
s1, s2, s3 = set("abc"), set("cde"), set("acf")
list_of_sets = [s1, s2, s3]
result = set.intersection(*list_of_sets) # {'c'}
我很惊讶地看到 .intersection()
调用了 set
class 而不是 set
对象。
我的问题是我在哪里可以看到这方面的文档?
上面链接的 Whosebug 回答说
Note that set.intersection is not a static method, but this uses the functional notation to apply intersection of the first set with the rest of the list. So if the argument list is empty this will fail.
但官方文档似乎没有描述这一点:intersection(*others)
。搜索“python set functional notation”似乎也无济于事。官方文档描述了我的期望,即在 set
对象上使用 .intersection()
,例如
result = s1.intersection(*[s2, s3])
我也很想知道可以以同样的方式使用其他数据结构中的哪些其他方法。
我认为它只是 set.itersection(*others)
实现方式的一个(未记录的)工件,因此应该适用于任何其他 classes,其方法支持可变数量的 other
对象。
为了说明和证明我的观点,这里有一个自定义 class 通过它自己的 intersection()
方法支持这种所谓的“函数式表示法”。
class Class:
def __init__(self, value=''):
self.value = str(value)
self.type = type(value)
pass
def __repr__(self):
return f'Class({self.type(self.value)!r})'
def intersection(self, *others):
result = self
for other in others:
result &= other # Perform via __and__() method.
return result
def __and__(self, other):
return type(self)('|'.join((self.value, other.value)))
c1 = Class('foo')
c2 = Class('bar')
c3 = Class(42)
print(f'c1: {c1}')
print(f'c2: {c2}')
print(f'c3: {c3}')
# Both produce the same result.
print(c1 & c2 & c3)
print(Class.intersection(c1, c2, c3))
输出
c1: Class('foo')
c2: Class('bar')
c3: Class(42)
Class('foo|bar|42')
Class('foo|bar|42')
除了martineau answer,像obj1.method1(...)
这样通过class实例调用的方法也可以用obj1_class.method1(obj1, ...)
调用,在C实现代码中我只看到假设第一个参数是一个集合。当你解压缩 others
时也会发生这种情况,这是一个集合列表。
也许它在方法帮助中没有记录,但无论如何都应该是预期的。
所以我也同意
and therefore should apply to any other classes with methods that support a variable number of other objects.