'greater than or equal' 集合与字符之间的比较如何工作
How 'greater than or equal' comparison between sets with characters work
我正在查看 Numpy 源代码 here,我发现了以下代码,它确保用户不会同时将 'C'
和 'F'
传递给 requirements
参数。
if requirements >= {'C', 'F'}:
raise ValueError('Cannot specify both "C" and "F" order')
我很好奇如何使用 >=
进行这样的检查。我在 python 文档中找到了 this answer on SO, and this。从这些我了解到,使用词法顺序,它首先比较两个第一个元素,如果它们相等,则看下一个元素,如果它们不同,则确定哪个较小。
当我尝试使用用户传递参数 'A', 'C', 'F'
的示例时,list
或 tuple
按预期工作,但是当我尝试使用 set
,我得到了不同的结果:
['A', 'C', 'F'] >= ['C', 'F'] # False
('A', 'C', 'F') >= ('C', 'F') # False
{'A', 'C', 'F'} >= {'C', 'F'} # True
我试图专门研究集合的词法排序,但由于集合也用于“数学”意义上,所以我发现的大多数示例和文章都使用 lists
。那么为什么sets
之间的比较不一样呢?
对于集合>=
仅仅意味着它有相同或更多的项目。订购不涉及它。所以这两个比较都是正确的:
{'C', 'F'} == {'C', 'F'}
{'F', 'C'} == {'C', 'F'}
这些集合都是相等的。添加一个字符,它们不再相等:
{'A', 'C', 'F'} != {'C', 'F'}
第一组现在被视为“大于”,因为它包含所有右手组,以及更多:
{'A', 'C', 'F'} > {'C', 'F'}
同样,顺序没有区别:
{'F', 'C', 'A'} > {'C', 'F'}
这意味着大于或等于将匹配具有所有字符的所有集合,即使还有其他字符:
{'C', 'F'} >= {'C', 'F'}
{'A', 'C', 'F'} >= {'C', 'F'}
{'F', 'C', 'A'} >= {'C', 'F'}
但删除'C'
或'F'
,它不再等于或大于。事实上,如果它只包含 'C'
或 'F'
它将被视为“小于”:
{'C'} < {'C', 'F'}
{'F'} < {'C', 'F'}
但加上其他字符,就不再等于、大于、小于了。所有这些都将是 False
{'A', 'B', 'Q'} == {'C', 'F'}
{'A', 'B', 'Q'} > {'C', 'F'}
{'A', 'B', 'Q'} < {'C', 'F'}
{'A', 'C', 'Q'} == {'C', 'F'}
{'A', 'C', 'Q'} > {'C', 'F'}
{'A', 'C', 'Q'} < {'C', 'F'}
只有不等于为真:
{'A', 'B', 'Q'} != {'C', 'F'}
{'A', 'C', 'Q'} != {'C', 'F'}
所以这意味着如果 requirements
同时包含 'C'
和 'F'
,那么 requirements >= {'C', 'F'}
将 return 为真,与顺序无关,如果项目多于 'C'
和 'F'
,但如果 requirements
仅包含 'C'
或 'F'
.[=33 中的一项或两者都不包含,则不成立=]
集合中的数据无序。这是 hash tables 的 属性 被称为 “无序关联数组”,因为存储的元素顺序因使用的散列技术而异,例如“b”可能在一个 运行 中放在“a”之后的内存中,并且可以在下一个 运行 中反转,这与 arrays/lists/tuples 不同,stored/accessed 的顺序相同无论机器如何定义。
为了形象化,创建一个脚本:
print({"a", "b", "c"})
然后尝试 运行3 次:
$ python3 script.py
{'c', 'a', 'b'}
$ python3 script.py
{'b', 'a', 'c'}
$ python3 script.py
{'a', 'b', 'c'}
如您所见,依靠集合的 lexical order 来比较每个元素是非常不可靠的,因为给定完全相同的输入,每个 运行.[=20 的顺序都会不同=]
最后,您可能需要查看 set. As you can see, it explicitly defines how the comparison operators would behave e.g. <=
means issubset 的文档。因此,集合比较不同的主要原因是因为这些被覆盖的方法。
issubset(other)
set <= other
Test whether every element in the set is in other.
- 它不表示任何有关词汇顺序的信息。它只告诉我们,它将检查一个元素是否在另一个元素中,而不考虑顺序。
- 这只是一种比较方法。有关完整列表,请参阅 docs。
在集合的上下文中,>
仅用于表示(适当的)超集,<
表示(适当的)子集。
set([1, 2]) <= set([1, 2, 3])
# True
set([1, 2]) < set([1, 2])
# False
此外,根据 docs -
The subset and equality comparisons do not generalize to a total
ordering function. For example, any two nonempty disjoint sets are not
equal and are not subsets of each other, so all of the following
return False: a<b, a==b, or a>b.
我正在查看 Numpy 源代码 here,我发现了以下代码,它确保用户不会同时将 'C'
和 'F'
传递给 requirements
参数。
if requirements >= {'C', 'F'}:
raise ValueError('Cannot specify both "C" and "F" order')
我很好奇如何使用 >=
进行这样的检查。我在 python 文档中找到了 this answer on SO, and this。从这些我了解到,使用词法顺序,它首先比较两个第一个元素,如果它们相等,则看下一个元素,如果它们不同,则确定哪个较小。
当我尝试使用用户传递参数 'A', 'C', 'F'
的示例时,list
或 tuple
按预期工作,但是当我尝试使用 set
,我得到了不同的结果:
['A', 'C', 'F'] >= ['C', 'F'] # False
('A', 'C', 'F') >= ('C', 'F') # False
{'A', 'C', 'F'} >= {'C', 'F'} # True
我试图专门研究集合的词法排序,但由于集合也用于“数学”意义上,所以我发现的大多数示例和文章都使用 lists
。那么为什么sets
之间的比较不一样呢?
对于集合>=
仅仅意味着它有相同或更多的项目。订购不涉及它。所以这两个比较都是正确的:
{'C', 'F'} == {'C', 'F'}
{'F', 'C'} == {'C', 'F'}
这些集合都是相等的。添加一个字符,它们不再相等:
{'A', 'C', 'F'} != {'C', 'F'}
第一组现在被视为“大于”,因为它包含所有右手组,以及更多:
{'A', 'C', 'F'} > {'C', 'F'}
同样,顺序没有区别:
{'F', 'C', 'A'} > {'C', 'F'}
这意味着大于或等于将匹配具有所有字符的所有集合,即使还有其他字符:
{'C', 'F'} >= {'C', 'F'}
{'A', 'C', 'F'} >= {'C', 'F'}
{'F', 'C', 'A'} >= {'C', 'F'}
但删除'C'
或'F'
,它不再等于或大于。事实上,如果它只包含 'C'
或 'F'
它将被视为“小于”:
{'C'} < {'C', 'F'}
{'F'} < {'C', 'F'}
但加上其他字符,就不再等于、大于、小于了。所有这些都将是 False
{'A', 'B', 'Q'} == {'C', 'F'}
{'A', 'B', 'Q'} > {'C', 'F'}
{'A', 'B', 'Q'} < {'C', 'F'}
{'A', 'C', 'Q'} == {'C', 'F'}
{'A', 'C', 'Q'} > {'C', 'F'}
{'A', 'C', 'Q'} < {'C', 'F'}
只有不等于为真:
{'A', 'B', 'Q'} != {'C', 'F'}
{'A', 'C', 'Q'} != {'C', 'F'}
所以这意味着如果 requirements
同时包含 'C'
和 'F'
,那么 requirements >= {'C', 'F'}
将 return 为真,与顺序无关,如果项目多于 'C'
和 'F'
,但如果 requirements
仅包含 'C'
或 'F'
.[=33 中的一项或两者都不包含,则不成立=]
集合中的数据无序。这是 hash tables 的 属性 被称为 “无序关联数组”,因为存储的元素顺序因使用的散列技术而异,例如“b”可能在一个 运行 中放在“a”之后的内存中,并且可以在下一个 运行 中反转,这与 arrays/lists/tuples 不同,stored/accessed 的顺序相同无论机器如何定义。
为了形象化,创建一个脚本:
print({"a", "b", "c"})
然后尝试 运行3 次:
$ python3 script.py
{'c', 'a', 'b'}
$ python3 script.py
{'b', 'a', 'c'}
$ python3 script.py
{'a', 'b', 'c'}
如您所见,依靠集合的 lexical order 来比较每个元素是非常不可靠的,因为给定完全相同的输入,每个 运行.[=20 的顺序都会不同=]
最后,您可能需要查看 set. As you can see, it explicitly defines how the comparison operators would behave e.g. <=
means issubset 的文档。因此,集合比较不同的主要原因是因为这些被覆盖的方法。
issubset(other)
set <= other
Test whether every element in the set is in other.
- 它不表示任何有关词汇顺序的信息。它只告诉我们,它将检查一个元素是否在另一个元素中,而不考虑顺序。
- 这只是一种比较方法。有关完整列表,请参阅 docs。
在集合的上下文中,>
仅用于表示(适当的)超集,<
表示(适当的)子集。
set([1, 2]) <= set([1, 2, 3])
# True
set([1, 2]) < set([1, 2])
# False
此外,根据 docs -
The subset and equality comparisons do not generalize to a total ordering function. For example, any two nonempty disjoint sets are not equal and are not subsets of each other, so all of the following return False: a<b, a==b, or a>b.