random
random

Reputation: 27

Replace values in a list based on condition of previous value

I would like to modify a list that has 3 different numbers [0, 1, 2]

Each 0 should be replaced with either the last 1 or 2 value depending on which was most recent during the iteration.

Is it possible to create the new list using a list comprehension?

I know I can use a for loop and just record the last 1 or 2 and append the values to the new list but I prefer the most pythonic way.

list = [1, 1, 2, 1, 0, 0, 1, 0, 2, 0, 0]

new_list = [1, 1, 2, 1, 1, 1, 1, 2, 2, 2]

I was using this but then realised that after 2 0s in a sequence it would start recording 0s again.

new_list = [list[index-1] if list[index] == 0 else value for index,value in enumerate(list)]

Upvotes: 0

Views: 2914

Answers (5)

VISHMA PRATIM DAS
VISHMA PRATIM DAS

Reputation: 21

Depends on the condition. In most cases, you can place the condition within the while loop in the if-else criteria statements.

If, say, you want to replace the content of a list if the previous value was something,

size = len(list)
while True:
    index = index + 1
    if index!=0 and index<size:
        if list[index-1]==something:
            list[index] = value to be replaced
        if index == (size-1):
            a = 0
            for a in (0, (size-1)):
                print(a,":",list(a))
            break

Upvotes: 0

ljuk
ljuk

Reputation: 784

Perform that just with a list comprehension could be a little weird, so here my solution (without creating a new list):

my_list = [1, 1, 2, 1, 0, 0, 1, 0, 2, 0, 0]
last_not_zero = 0

for index, number in enumerate(my_list):
    if number!=0:
        last_not_zero = number
    else:
        my_list[index] = last_not_zero

print(my_list)

And you'll get: [1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2]

Upvotes: 2

random
random

Reputation: 27

How about this

last_value = 0
new_list = []
for value in list:
    if value != 0:
        last_value = value
        new_list.append(value)
    else:
        new_list.append(last_value)

Upvotes: 0

Mark
Mark

Reputation: 92440

Starting in python 3.8 you now have the walrus operator := which can assign values as part of an expression and works in list comprehensions. You just need to decide what the first value will be if the list starts with 0 since there is no previous value:

alist = [1, 1, 2, 1, 0, 0, 1, 0, 2, 0, 0]

j = 0
[j:= i if i else j for i in alist]
# [1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2]

Upvotes: 4

Vishnudev Krishnadas
Vishnudev Krishnadas

Reputation: 10960

If you have a large list or you are using Pandas in your code,

import pandas as pd

s = pd.Series(list)
s.replace(0, pd.np.nan).ffill().to_list()

Output

[1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2]

NOTE: If you are not using pandas/numpy in your code, then basic for loop would be the best way to do this. Advise using the above code only for large arrays with multiple manipulations.

Upvotes: 1

Related Questions