为了账号安全,请及时绑定邮箱和手机立即绑定

TypeError:“枚举”类型的对象没有 len()

TypeError:“枚举”类型的对象没有 len()

慕田峪4524236 2022-07-26 10:19:41
这是我的代码: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    returnprint(twosum([2, 7, 11, 15], 9)) 我得到错误:TypeError: object of type 'enumerate' has no len()我认为我们可以将枚举对象视为列表。我在网上找到了将枚举对象视为列表的解决方案。谁能解释我为什么会收到这个错误?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

TypeError: object of type 'enumerate' has no len()

len()功能要求对象具有或实现该__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)]


查看完整回答
反对 回复 2022-07-26
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

enumerate只是为可迭代添加一个计数器,它不是可迭代的。枚举对象可以转换为列表,然后可以使用。


至于您的问题,可以使用非枚举解决方案


def twosum(a, t):

    f, l = 0, len(a) - 1

    while f <= l:

        if a[f] + a[l] == t:

            return [a.index(a[f]), a.index(a[l])]

        else:

            f += 1

            l -= 1

twosum([2, 7, 11, 15], 17)

这将返回 [0, 3]。对于枚举解决方案,


def twosum(a, t):

    f, l = 0, len(a)-1

    a = list(enumerate(a))

    while(f <= l):

        if (a[f][1] + a[l][1] == t):

            return [a[f][0], a[l][0]]

        else:

            f += 1

            l -= 1

twosum([2, 7, 11, 15], 17)

这也返回 [0, 3]


查看完整回答
反对 回复 2022-07-26
?
潇湘沐

TA贡献1816条经验 获得超6个赞

这个解决方案奏效了。我必须先将枚举对象转换为列表。否则它甚至不能下标。


def twosum(a, t):

    a = enumerate(a)

    a = sorted(a, key=lambda x:x[1])

    f, l = 0, len(a)-1

    while(f < l):

        if (a[f][1] + a[l][1] == t):

            return [a[f][0], a[l][0]]

        elif (a[f][1] + a[l][1] < t):

            f += 1

        else:

            l -= 1


查看完整回答
反对 回复 2022-07-26
  • 3 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号