为什么排序被记录为采用可迭代而不是集合?

时间:2019-12-07 08:49:30

标签: python

有没有更深层的含义,为什么Python的sorted被记录为采用可迭代(可能是无限的)而不是集合(已调整大小)?

例如,它将永远运行:

# DO NOT RUN
import itertools

for item in sorted(itertools.count()):
    print(item)

我知道他们希望允许sorted处理集合的可迭代对象,而不是集合本身,但是并没有根本的区别(也许反映在collections.abc中)在保证引发StopIteration的可迭代对象和可能是无限的可迭代对象之间?

2 个答案:

答案 0 :(得分:4)

之所以这样记录是因为它没有利用__len__来工作,尽管您是对的,因为它应该要求有限的Iterable才有意义。请注意,与Iterable相反,__len__可以是有限的,但不支持Collection。 Python并未在 finite indefinite Iterable之间进行明确区分。

考虑以下玩具示例:

x = iter(range(10, 0, -1))

len(x)
# TypeError: object of type 'range_iterator' has no len()

# BUT
y = sorted(x)
print(y)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

答案 1 :(得分:3)

它被记录为可迭代,因为它需要可迭代。它不仅限于收藏。只要是有限的,就可以用mapsorted迭代器进行排序。

当然,可迭代项必须是有限的,但这不是类型区别。同一可迭代类的不同实例可以是有限的或无限的。例如,某些生成器是有限的,而某些生成器是无限的。您无法为“有限可迭代”定义ABC。

文档可以更明确地说明有限性要求,也可以更明确地说明其他要求,例如<是对输入元素或{{1 }}返回值。