setitem and getitem -- python
Solution 1
You have several problems:
extend
is appending essentially a new vector to the end of the original, rather than increasing the length of the original. It's not clear that it needs to return a string representation of the modified vector (unless it's just for debugging purposes).def extend(self, newlength): # Assume newlength is greater than the old self.vector.extend([0] * (newlength - len(self)))
__setitem__
needs to callextend
if the key is too large.def __setitem__(self, key, item): if key >= len(self): self.vector.extend(key+1) self.vector[key] = item
__getitem__
needs to access the underlying list, not use an undefined attributedef __getitem__(self, key): # It's probably better to catch any IndexError to at least provide # a class-specific exception return self.vector[key]
Solution 2
The problem is the vector you created has no length because of the default value given the length
keyword argument in the __init__()
method definition. Try this:
vector = Vec(4)
vector[3] = 26
print vector # --> [0, 0, 0, 26]
Solution 3
It would be easier in __str__
if you do this
return str(self.vector)
Solution 4
You need to adapt your __getitem__
and __setitem__
to delegate to the underlying list:
def __setitem__(self, key, item):
self.vector[key] = item
# return doesn't make sense here
def __getitem__(self, key):
# not sure what self.__key is ? Let's return value from index in `self.vector` instead
return self.vector[key]
Related videos on Youtube

user3014014
Updated on August 27, 2020Comments
-
user3014014 over 2 years
I've created a python program that makes a vector. Now i want to set an item using a function
__setitem__
and__getitem__
. So for example, ifvector = Vec()
andvector[3] = 26
would change an empty vector to[0, 0, 0, 26]
. I need to override the__getitem__
and__setitem__
I've listed the code below, but i'm having troubles with the get and set functions. Any advice?class Vec: def __init__(self, length = 0): self.vector = [0]*length def __str__(self): return '[{}]'.format(', '.join(str(i) for i in self.vector)) #This formats the output according to the homework. #Adds '[' and ']' and commas between each 0 def __len__(self): return len(self.vector) def extend(self, newLen): self.vector.append([0]*newLen) return (', '.join(str(j) for j in self.vector)) def __setitem__(self, key, item): self.vector[key] = item def __getitem__(self, key): return self.vector[key]
-
Admin about 9 yearsPlease explain better than "am not able", it would be very useful to see a complete example and a stacktrace such as: >>> v = Vec() >>> v[3] = 26 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> v[3] = 26 File "C:\Users\S\Desktop\test.py", line 18, in setitem self.vector[key] = item IndexError: list assignment index out of range >>>
-