StacyM - 1 year ago 62
Python Question

# Python - Replacing element in list without list comprehension, slicing or using [ ]s

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.

Using
`index`
and other list methods, write a function
`replace(list, X, Y)`
which replaces all occurrences of
`X`
in
`list`
with
`Y`
. For example, if
`L = [3, 1, 4, 1, 5, 9]`
then
`replace(L, 1, 7)`
would change the contents of
`L`
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)
``````