class List:
def __init__(self, list):
self.list = list
def delete(self, index):
if self.list.index(index) in self.list:
self.list.pop(index)
else:
print("The value isn't in the list.")`
list = List(["green", "blue", "yellow", "brown"])
list.delete("no")
I tried to delete the value "no" in the list, and it gives me a Value Error, that says "The value is not in list"
CodePudding user response:
Your code has two logic problems:
self.list.index(index) in self.list
doesn't do what you think it does, the index won't be in the list, the word may beself.list.pop(index)
would popindex
, but it expects an actual index, which is not what you're passing to the method
Your code also suffers from horrible naming. To make a point, here's an almost working version of your code with your naming scheme dialed to 11:
class List:
def __init__(List, list):
List.list = list
def List(List, index):
if List.list.index(index) > -1:
List.list.pop(List.list.index(index))
else:
print("The value isn't in the list.")
list = List(["list", "List", "LIST", "list "])
list.List("list")
print(list.list)
list.List("not in list")
Output:
['List', 'LIST', 'list ']
Traceback (most recent call last):
File "F:\Project\Python\sandbox_310\my_list.py", line 15, in <module>
list.List("not in list")
File "F:\Project\Python\sandbox_310\my_list.py", line 6, in List
if List.list.index(index) > -1:
ValueError: 'not in list' is not in list
Here's a more reasonably named version, that catches the exception, so it works as you expect:
class MyList:
def __init__(self, xs):
self.xs = xs
def delete(self, x):
try:
self.xs.pop(self.xs.index(x))
except ValueError:
print("The value isn't in the list.")
example = MyList(["green", "blue", "yellow", "brown"])
example.delete("green")
print(example.xs)
example.delete("no")
Output;
['blue', 'yellow', 'brown']
The value isn't in the list.
And here's a streamlined version, which no longer throws an exception (because it checks whether it can remove before trying to do so, and not calling .index()
which causes the error as well):
class MyList:
def __init__(self, xs):
self.xs = xs
def delete(self, x):
if x in self.xs:
self.xs.remove(x)
else:
print("The value isn't in the list.")
example = MyList(["green", "blue", "yellow", "brown"])
example.delete("green")
print(example.xs)
example.delete("no")
Of course, you could also just:
class MyList(list):
def safe_remove(self, x):
if x in self:
self.remove(x)
else:
print("The value isn't in the list.")
example = MyList(["green", "blue", "yellow", "brown"])
example.remove("green") # MyList *is* a list, so all standard methods work
print(example)
example.safe_remove("no") # but using the added safe_remove, you get what you want
Result:
['blue', 'yellow', 'brown']
The value isn't in the list.
CodePudding user response:
Firstly, the value ins't in the list.
Secondly, if you want the value "no" from the list the do the following
class List:
def __init__(self, list):
self.list = list
def delete(self, index):
if index in self.list:
self.list.remove(index)
else:
print("The value isn't in the list.")
Run below
list = List(["green", "blue", "yellow", "brown", "no"]) --> Create
print(list.list) --> Print your above list
list.delete("no") --> Delete an item
print(list.list) --> re-print the list