📜  Python|根据模式在列表中增加 1

📅  最后修改于: 2022-05-13 01:55:47.129000             🧑  作者: Mango

Python|根据模式在列表中增加 1

给定一个二进制数 0 和 1 的列表,编写一个Python程序来转换列表,使得每当 1 在出现一系列 0 之后出现,将其递增 n+1,其中“n”是最后一个递增.

例子:

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]


方法#1:朴素的方法

对于给定问题,这是一种天真的方法。它使用两个变量“previous”和“grp”来存储先前增加的数字并存储组中 1 的数量。现在,使用 for 循环,相应地增加 1。

# 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]

方法 #2:使用itertools模块中的countchaingroupby
对于我们使用itertools模块中的countchaingroupby的给定问题,这是一种有效且更 Pythonic 的方法。

# 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]