Python 为什么enumerate应该接受集合作为输入?
pytonPython 为什么enumerate应该接受集合作为输入?,python,dictionary,set,enumerate,Python,Dictionary,Set,Enumerate,pytonset表示未排序,那么为什么enumerate接受它们作为输入呢 同样的问题也适用于词典 从我的观点来看,这些都给人一种错误的印象,即有一种可以预测的方法来列举它们,但事实并非如此 这是相当误导的。当我请求enumerate(set)或enumerate(dict)时,我希望enumerate至少会发出警告 有人能解释为什么没有这个警告吗?允许不可预测的枚举是“pythonic”吗?enumerate接受任何包含set和dict的iterableset可能是无序的,但其迭代顺序不是任意
set
表示未排序,那么为什么enumerate
接受它们作为输入呢
同样的问题也适用于词典
从我的观点来看,这些都给人一种错误的印象,即有一种可以预测的方法来列举它们,但事实并非如此
这是相当误导的。当我请求enumerate(set)或enumerate(dict)时,我希望enumerate至少会发出警告
有人能解释为什么没有这个警告吗?允许不可预测的枚举是“pythonic”吗?
enumerate
接受任何包含set
和dict
的iterableset
可能是无序的,但其迭代顺序不是任意的;如果多次迭代同一集合,它将以相同的顺序生成元素
>>> from collections import OrderedDict
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False
还要注意,从Python 3.7开始,dict保持插入顺序。这是否有用完全取决于您的用例。
枚举
接受任何包含集合
和dict的iterableset
可能是无序的,但其迭代顺序不是任意的;如果多次迭代同一集合,它将以相同的顺序生成元素
>>> from collections import OrderedDict
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False
还要注意,从Python 3.7开始,dict保持插入顺序。这是否有用完全取决于您的用例。容器及其迭代器之间有区别。从技术上讲,enumerate
不适用于set
、dict
或list
,因为这些类型都不是迭代器。但是,它们是可迭代的,这意味着enumerate
可以通过隐式使用iter
函数(即enumerate(some_list\u dict\u或_set)==enumerate(iter(some_list\u dict\u或_set))
)
两个OrderedDict
s的情况不同,它们只是相等,它们具有相同的键,这些键的值相同,并且键是按相同的顺序添加的
>>> from collections import OrderedDict
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False
容器与其迭代器之间有区别。从技术上讲,enumerate
不适用于set
、dict
或list
,因为这些类型都不是迭代器。但是,它们是可迭代的,这意味着enumerate
可以通过隐式使用iter
函数(即enumerate(some_list\u dict\u或_set)==enumerate(iter(some_list\u dict\u或_set))
)
两个OrderedDict
s的情况不同,它们只是相等,它们具有相同的键,这些键的值相同,并且键是按相同的顺序添加的
>>> from collections import OrderedDict
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False
事实上,集合是可预测的,这已经给人们一种错误的印象,即存在一个可预测的顺序。同样的事实是,您可以打印它们,并且在打印时元素会以某种顺序显示。在一些完全合理的情况下,即使元素的特定顺序无关紧要,也只需知道您已经处理了多少元素是很重要的。正如@user2357112supportsMonica所说,仅仅是iterable已经让人们感到困惑,enumerate
并没有让事情变得更糟。enumerate
只是简单地枚举(即计数)来自iterable的值。没有人声称返回的值比简单的计数更有用。一些像列表这样的可重用项可以使用该计数作为索引(假设列表本身没有更改),但这不是简单计数的要求。例如,您可以枚举文件对象以获取行计数,但不能为文件对象编制索引。关键是没有警告。我执行的代码结果不可预测,因为每次或在不同的机器上读取集合的方式可能不同,或者因为天气变化。我觉得我必须被警告潜在的不可预测的结果。有没有一种方法可以将此标记给python开发人员或发出请求?集合是可编辑的这一事实已经给人一种错误的印象,即存在一个可预测的顺序。同样的事实是,您可以打印它们,并且在打印时元素会以某种顺序显示。在一些完全合理的情况下,即使元素的特定顺序无关紧要,也只需知道您已经处理了多少元素是很重要的。正如@user2357112supportsMonica所说,仅仅是iterable已经让人们感到困惑,enumerate
并没有让事情变得更糟。enumerate
只是简单地枚举(即计数)来自iterable的值。没有人声称返回的值比简单的计数更有用。一些像列表这样的可重用项可以使用该计数作为索引(假设列表本身没有更改),但这不是简单计数的要求。例如,您可以枚举文件对象以获取行计数,但不能为文件对象编制索引。关键是没有警告。我执行的代码结果不可预测,因为每次或在不同的机器上读取集合的方式可能不同,或者因为天气变化。我觉得我必须被警告潜在的不可预测的结果。有没有一种方法可以将此标记给python开发人员或提出请求?感谢您指出这一微妙之处。这是非常隐蔽的使用和感觉你有“有毒电池”的包装。如果能从enumerate得到一个警告,我会非常感激的。我在《Symphy》的输出中使用了免费符号,honeslty把我弄得一团糟。谢谢你指出了这个微妙之处。这是非常隐蔽的使用和感觉你有“有毒电池”的包装。如果能从enumerate得到一个警告,我会非常感激的。我用了symphy
free\u symbols
的输出,而honeslty把我弄得一团糟。