Python | Incrementar 1 en la lista según el patrón

Dada una lista de números binarios 0 y 1, escriba un programa en Python para transformar la lista de tal manera que cada vez que aparezca 1 después de que ocurra una secuencia de 0, incremente en n+1, donde ‘n’ es el último incremento .

Ejemplos:

Input : [0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1]
Output : [0, 1, 0, 0, 2, 2, 0, 0, 0, 3, 3, 3]

Input : [1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1]
Output : [1, 0, 2, 0, 0, 0, 3, 3, 0, 0, 4, 4, 4, 0, 5, 0, 6]

 
Enfoque n.º 1: enfoque ingenuo

Este es un enfoque ingenuo para el problema dado. Utiliza dos variables ‘anterior’ y ‘grp’ para almacenar el número previamente incrementado y para almacenar el número de 1 en un grupo. Ahora, usando un bucle for, incremente 1 en consecuencia.

# Python3 program to increment 1's in 
# list based on pattern 
  
def transform(lst):
      
    previous = 0
    grp = 0
    for elem in lst:
        if elem and not previous:
             grp += 1
        previous = elem
        yield (grp if elem else 0)
      
# Driver code
lst = [0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1]
x = (transform(lst))
res = []
for i in range(0, len(lst)):
    res.append(next(x))
print(res)
Producción:

[0, 1, 0, 0, 2, 2, 0, 0, 0, 3, 3, 3]

Enfoque n.° 2: usar count , chain y groupby del módulo itertools .
Este es un enfoque eficiente y más pythonico para el problema dado donde usamos count , chain y groupby del módulo itertools .

# Python3 program to increment 1's in 
# list based on pattern 
from itertools import * 
  
def transform(lst):
      
    c = count(1)
    return list(chain(*[list(g) if k != 1 else [next(c)]*len(list(g)) 
    for k, g in groupby(lst)]))
      
# Driver code
lst = [0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1]
print(transform(lst))
Producción:

[0, 1, 0, 0, 2, 2, 0, 0, 0, 3, 3, 3]

Publicación traducida automáticamente

Artículo escrito por Smitha Dinesh Semwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *