Home > Enterprise >  Python - len function not working as expected, and giving me the error "TypeError: object of ty
Python - len function not working as expected, and giving me the error "TypeError: object of ty

Time:09-23

While studying linked lists from - 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".

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. .Why is this?

CodePudding user response:

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.

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()

CodePudding user response:

When you try is_link([1,2]), then, since the list is of length 2, it will try to evaluate is_link(s[1]). Which in this case is is_link(2). Which then leads to len(2) which gives the error message, since 2 is not a list. len can only be applied on lists

CodePudding user response:

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. You need to check whether the argument in method is_link is list like that

return type(s) == list and (s == empty or (len(s) == 2 and is_link(s[1])))
  • Related