python - TypeError:“枚举”类型的对象没有 len()
问题描述
这是我的代码:
def twosum(a, t):
a = enumerate(a)
f, l = 0, len(a)-1
while(f <= l):
if (a[f][1] + a[l][1] == t):
return [a[f][0], a[l][0]]
else:
f += 1
l -= 1
return
print(twosum([2, 7, 11, 15], 9))
我得到错误:
TypeError: object of type 'enumerate' has no len()
我认为我们可以将枚举对象视为列表。我在网上找到了将枚举对象视为列表的解决方案。谁能解释我为什么会收到这个错误?
解决方案
TypeError: object of type 'enumerate' has no len()
object.__len__(self)
调用以实现内置函数
len()
。应该返回对象的长度,整数 >= 0。
不幸的是,enumerate
返回一个没有的枚举对象__len__
:
>>> a = enumerate([1,2,3])
>>> a
<enumerate object at 0x10e496be0>
>>> dir(a)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__',
'__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__']
与list
支持的 's不同len()
:
>>> a = [1,2,3]
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
...
'__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__',
...
'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
您还可以注意到enumerate 对象也没有允许您使用like for s__getitem__
访问项目的方法。这就是为什么您在回答中说“它甚至不可下标”。obj[index]
list'
我认为我们可以将枚举对象视为列表。
不,不是。枚举对象的行为更像一个迭代器,这是 Python 表示可能是无限的“数据流”的方式。您可以通过调用该next()
方法来访问数据,直到引发异常 ( StopIteration
)。
重复调用迭代器的
__next__()
方法(或将其传递给内置函数next()
)会返回流中的连续项。当没有更多数据可用时,StopIteration
会引发异常。
>>> a = enumerate([1,2,3])
>>> next(a)
(0, 1)
>>> next(a)
(1, 2)
>>> next(a)
(2, 3)
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
我认为您会认为它们就像list
's 一样,因为您也可以将它们放入像常规一样的循环结构中list
并遍历每个元素:
>>> a = enumerate([1,2,3])
>>> for i in a:
... print(i)
...
(0, 1)
(1, 2)
(2, 3)
在这种情况下,对于每次迭代,枚举对象都会提供一个元组,其中包含下一个元素的索引和元素本身。循环的for
工作和结束方式与使用enumerate objectnext()
的方法时相同。
如enumerate()
文档中所示,list
如果您需要类似列表的内容,您可以简单地将其转换为 a:
>>> a = list(enumerate([1,2,3]))
>>> a
[(0, 1), (1, 2), (2, 3)]
推荐阅读
- java - osgi NoClassDefFoundError - jar 目录
- spring-cloud-contract - Wiremock 请求与多部分不匹配
- angular - 带有订阅的 Angular Auth Guard
- python - Json 转换为 csv 文件但数据没有逐列跟随
- python - 如何为 CustomMessage_AdminCreateUser 触发器发送自定义消息?
- angular - 有没有办法在禁用 CSRF 的同时保留 Spring 默认登录页面?
- angular - SASS 无效的属性值
- javascript - 在 Angular 8 应用程序中获取选项配置的打字稿错误
- java - 同步访问相同文件,并发访问不同文件
- c++ - 循环多个枚举