在遇到第一个 True 值前计算二维列表中连续 False 值的数量(Python)

52 阅读2分钟

给定一个嵌套列表 matrix2bool,其中元素为 True 或 False。我们想要计算每个子列表中连续出现 False 的数量,直到遇到第一个 True 值。生成的列表 numoffalsescount 记录每个子列表中连续 False 值的数量,最终将其收集到列表 numoffalsescountlist 中。

以下是示例代码:

def neighborhood(iterable):
    iterator = iter(iterable)
    prev = None
    item = iterator.next()  # throws StopIteration if empty.
    for next in iterator:
        yield (prev,item,next)
        prev = item
        item = next
    yield (prev,item,None)

matrix2bool = [[True, False, True, False, False, True, False, True],
              [True, False, False, True, True, True, True, True],
              [False]]

i11 = 0
numoffalsescountlist = []
for index16 in matrix2bool:
    falsecount = 0
    falsecounttemp = 0
    falsecountmax = 0
    init = 0
    numoffalsescount = []
    for prev,item,next in neighborhood(matrix2bool[i11]):   
        if next == False:
            #print item, next
            if falsecount != 0:
                falsecount += 1
                falsecounttemp = falsecount
                #init = 0
                init += 1
                if falsecounttemp > falsecountmax:
                    falsecountmax = falsecounttemp
                print 'falsecount', falsecount
                print 'init', init
                print 'fcm', falsecountmax
                numoffalsescount.append(0)
                numoffalsescount[falsecount-init] = falsecountmax
                if falsecount != 0:
                    numoffalsescount[falsecount-1] = 0
            else:
                init += 1
                falsecount += 1
                falsecounttemp = falsecount
                falsecounttemp += falsecount - 1
                numoffalsescount.append(falsecounttemp)
        else:
            if falsecount != 0:
                falsecount = 0
                numoffalsescount.append(falsecount)
            else:
                x = 0
                numoffalsescount.append(0)
    print 'numoffalsescount', numoffalsescount
    i11 += 1
    numoffalsescountlist.append(numoffalsescount)
print 'numoffalsescountlist', numoffalsescountlist

然而,上述代码存在一个问题:它将遇到第一个 True 值后的连续 False 值的数量也计算在内,因此输出结果不正确。

2、解决方案

为了解决这个问题,我们可以采用以下思路:

  1. 在给定的二维列表 matrix2bool 中,我们需要对每个子列表分别进行计算。
  2. 对于每个子列表,我们可以使用迭代器 itertools.groupby() 来将列表中的连续 False 值组合成一个组,并计算每个组中 False 值的数量。
  3. 将每个组中连续 False 值的数量存储在列表 numoffalsescount 中,直到遇到第一个 True 值。
  4. 将所有子列表的 numoffalsescount 列表收集到列表 numoffalsescountlist 中。

以下是修改后的代码:

import itertools

def neighborhood(iterable):
    iterator = iter(iterable)
    prev = None
    item = iterator.next()  # throws StopIteration if empty.
    for next in iterator:
        yield (prev,item,next)
        prev = item
        item = next
    yield (prev,item,None)

matrix2bool = [[True, False, True, False, False, True, False, True],
              [True, False, False, True, True, True, True, True],
              [False]]

numoffalsescountlist = []
for row in matrix2bool:
    numoffalsescount = []
    for key, group in itertools.groupby(row):
        if not key:
            numoffalsescount.append(len(list(group)))

    numoffalsescountlist.append(numoffalsescount)

print(numoffalsescountlist)

上述代码的输出结果为:

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

这正是我们期望的结果。