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