Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么enumerate应该接受集合作为输入?_Python_Dictionary_Set_Enumerate - Fatal编程技术网

Python 为什么enumerate应该接受集合作为输入?

Python 为什么enumerate应该接受集合作为输入?,python,dictionary,set,enumerate,Python,Dictionary,Set,Enumerate,pytonset表示未排序,那么为什么enumerate接受它们作为输入呢 同样的问题也适用于词典 从我的观点来看,这些都给人一种错误的印象,即有一种可以预测的方法来列举它们,但事实并非如此 这是相当误导的。当我请求enumerate(set)或enumerate(dict)时,我希望enumerate至少会发出警告 有人能解释为什么没有这个警告吗?允许不可预测的枚举是“pythonic”吗?enumerate接受任何包含set和dict的iterableset可能是无序的,但其迭代顺序不是任意

pyton
set
表示未排序,那么为什么
enumerate
接受它们作为输入呢

同样的问题也适用于
词典

从我的观点来看,这些都给人一种错误的印象,即有一种可以预测的方法来列举它们,但事实并非如此

这是相当误导的。当我请求enumerate(set)或enumerate(dict)时,我希望enumerate至少会发出警告


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

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

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

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

枚举
接受任何包含
集合
dict的iterable
set
可能是无序的,但其迭代顺序不是任意的;如果多次迭代同一集合,它将以相同的顺序生成元素

>>> 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把我弄得一团糟。