I'm taking this online Python course and they do not like the students using one-line solutions. The course will not accept brackets for this solution.
I already solved the problem using list comprehension, but the course rejected my answer.
The problem reads:
Using
index
and other list methods, write a functionreplace(list, X, Y)
which replaces all occurrences ofX
inlist
withY
. For example, ifL = [3, 1, 4, 1, 5, 9]
thenreplace(L, 1, 7)
would change the contents ofL
to[3, 7, 4, 7, 5, 9]
. To make this exercise a challenge, you are not allowed to use[]
.Note: you don't need to use return.
This is what I have so far, but it breaks because of TypeError: 'int' object is not iterable.
list = [3, 1, 4, 1, 5, 9]
def replace(list, X, Y):
while X in list:
for i,v in range(len(list)):
if v==1:
list.remove(1)
list.insert(i, 7)
replace(list, 1, 7)
This was my original answer, but it was rejected.
list = [3, 1, 4, 1, 5, 9]
def replace(list, X, Y):
print([Y if v == X else v for v in list])
replace(list, 1, 7)
Any ideas on how to fix my longer solution?
range()
returns a flat list of integers, so you can't unpack it into two arguments. Use enumerate
to get index and value tuples:
def replace(l, X, Y):
for i,v in enumerate(l):
if v == X:
l.pop(i)
l.insert(i, Y)
l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)
If you're not allowed to use enumerate
, use a plain old counter:
def replace(l, X, Y):
i = 0
for v in l:
if v == X:
l.pop(i)
l.insert(i, Y)
i += 1
l = [3, 1, 4, 1, 5, 9]
replace(list, 1, 7)
Finally, you could use what the authors of the question were probably looking for (even though this is the most inefficient approach, since it linear searches through the list on every iteration):
def replace(l, X, Y):
for v in l:
i = l.index(v)
if v == X:
l.pop(i)
l.insert(i, Y)
l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)
You can also try this (not using []
s or enumerate()
, as required):
for i in range(len(l)): # loop over indices
if l.__index__(i) == X: # i.e. l[i] == X
l.__setitem__(i, Y) # i.e. l[i] = Y
This probably isn't what the assignment wants you to do, but I'll leave it here for learning purposes.
Note: You shouldn't use list
as a variable name since that's already used by a built-in function. I've used l
here instead.
If enumerate
is not allowed, you can also use a while
loop.
>>> def replace(L_in, old_v, new_v):
while old_v in L_in:
idx=L_in.index(old_v)
L_in.pop(idx)
L_in.insert(idx, new_v)
>>> L = [3, 1, 4, 1, 5, 9]
>>> replace(L, 1, 7)
>>> L
[3, 7, 4, 7, 5, 9]
Do not use list
as a name, it will cause you much pain.
def replace(my_list, X, Y):
while X in my_list:
my_list.insert(my_list.index(X), Y)
my_list.pop(my_list.index(X))
This worked for me. Pretty straight forward. Probably a way of doing it with less lines, but based on what has been taught on the website so far, this works.
def replace(L, X, Y):
while X in L:
i = L.index(X)
L.insert(i, Y)
L.remove(X)
totally agree with Asad Saeeduddin but, 1st value of i must be -1, it will help replace the 1st object in list in need
def replace(l, X, Y):
i = -1
for v in l:
i += 1
if v == X:
l.pop(i) # remove item at given position (position number i)
l.insert(i, Y) # insert item Y at position i
l = [1, 1, 4, 1, 5, 9]
replace(l, 1, 7)
print(l)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.