[英]Python - len function not working as expected, and giving me the error "TypeError: object of type 'int' has no len()"
While studying linked lists from - https://composingprograms.com/pages/23-sequences.html#linked-lists在学习链表时 - https://composingprograms.com/pages/23-sequences.html#linked-lists
empty ='empty'
four = [1, [2, [3, [4, 'empty']]]]
x = [1,2];
def is_link(s):
"""s is a linked list if it is empty or a (first, rest) pair."""
return s == empty or (len(s) == 2 and is_link(s[1]))
print(is_link(four))
print(is_link(x))
The program recognizes four as a linked list, But when i plug in x it returns an error instead of returning "False".该程序将四个识别为链表,但是当我插入 x 时,它返回错误而不是返回“False”。
If i change value of x to just [1] or [1,2,3] it returns as expected, but if i enter a normal list [1,2] with 2 values i run into this error.如果我将 x 的值更改为 [1] 或 [1,2,3] 它会按预期返回,但是如果我输入具有 2 个值的普通列表 [1,2] 我会遇到此错误。 .Why is this?
。为什么是这样?
The problem is in this part:问题出在这部分:
is_link(s[1])
When you pass x[1] to is_link method s is 2 (has type int) thus it doesnt have len() method.当您将 x[1] 传递给 is_link 方法时,s 为 2(具有 int 类型),因此它没有 len() 方法。 You need to check whether the argument in method is_link is list like that
您需要检查方法 is_link 中的参数是否是这样的列表
return type(s) == list and (s == empty or (len(s) == 2 and is_link(s[1])))
Look at the executions, on your condition len(s) == 2
this only satisfies [1, 2]
so it checks for the next one is_link(s[1])
which raises an error because it's a check length of integer in next iteration.查看执行情况,在您的条件下
len(s) == 2
这仅满足[1, 2]
因此它检查下一个is_link(s[1])
会引发错误,因为它的检查长度为 integer 在下一个迭代。
In [24]: print(is_link([1]))
[1]
False
In [25]: print(is_link([1, 2, 3]))
[1, 2, 3]
False
In [26]: print(is_link([1, 2]))
[1, 2]
2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [26], in <module>
----> 1 print(is_link([1, 2]))
Input In [20], in is_link(s)
2 print(s)
3 """s is a linked list if it is empty or a (first, rest) pair."""
----> 4 return s == empty or (len(s) == 2 and is_link(s[1]))
Input In [20], in is_link(s)
2 print(s)
3 """s is a linked list if it is empty or a (first, rest) pair."""
----> 4 return s == empty or (len(s) == 2 and is_link(s[1]))
TypeError: object of type 'int' has no len()
When you try is_link([1,2])
, then, since the list is of length 2, it will try to evaluate is_link(s[1])
.当您尝试
is_link([1,2])
时,由于列表的长度为 2,它将尝试评估is_link(s[1])
。 Which in this case is is_link(2)
.在这种情况下是
is_link(2)
。 Which then leads to len(2)
which gives the error message, since 2 is not a list.然后导致
len(2)
给出错误消息,因为 2 不是列表。 len
can only be applied on lists len
只能应用于列表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.