为什么枚举应该接受一个集合作为输入?

Why enumerate should accept a set as an input?

一个 pyton set 意味着没有顺序,那么为什么 enumerate 接受它们作为输入?

同样的问题也适用于 dictionary

从我的角度来看,这些给人一种错误的印象,即有一种可预测的方式来枚举它们,但事实并非如此。

这是相当具有误导性的。当我请求 enumerate(set) 或 enumerate(dict) 时,我至少会收到 enumerate 的警告。

谁能解释为什么没有这个警告?允许无法预测的枚举是“pythonic”吗?

enumerate 接受任何 iterable,其中包括 setdictset 可能是无序的,但它的迭代顺序不是任意的;如果多次迭代同一个集合,它将以相同的顺序生成元素。

另请注意,从 Python 开始,3.7 dict 保留了 插入顺序 。这是否有用完全取决于您的用例。

容器和它的迭代器是有区别的。从技术上讲,enumerate 不适用于 setdict list,因为这些类型的 none是一个迭代器。不过,它们是 iterable,这意味着 enumerate 可以 get 通过隐式使用 iter 函数(即, enumerate(some_list_dict_or_set) == enumerate(iter(some_list_dict_or_set)))

>>> iter([1,2,3])
<list_iterator object at 0x109d924e0>
>>> iter(dict(a=1, b=2))
<dict_keyiterator object at 0x109d4b818>
>>> iter({1,2,3})
<set_iterator object at 0x109d53ab0>

因此,虽然给定的 容器 的元素可能没有任何固有的顺序,但它的迭代器可以 强加 一个顺序,并且 enumerate 简单地将排序与 int 值序列配对。

在 Python 3.7 或更高版本中比较 dictOrderedDict 时,您可以真正看到固有排序和强制排序之间的区别。两者都记得添加其密钥的顺序,但该顺序并不是 dict 身份的重要组成部分。也就是说,无论键的添加顺序如何,具有相同键和映射到这些键的值的两个字典是等效的。

>>> dict(a=1, b=2) == dict(b=2, a=1)
True

两个 OrderedDict 不一样,它们只是相等,它们具有相同的键,这些键的值相同, 键是按相同的顺序添加。

>>> from collections import OrderedDict
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False