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)
[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))
[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