92037


初心者です。Pythonで2次元リストの各リスト内の0.1.2.3番目をそれぞれNoneが出るまで何回連続で続いたか、またNoneが出たらリセットのプログラミングを教えていただきたいです。

入力：

[code]

    listA = [[0, -1, 1, 0],
             [1, 0, -1, 1],
             [0, 1, None, 1],
             [-1, None, 0, 1]]
    
[/code]

出力：

[code]

    [4, 0, 1, 4]
    
[/code]

このようにリスト内の0番は4回連続で続いたので4、1番目は4行目にNoneが出たのでリセットで0、2番目は3行目にNoneが出たのでリセットされて1、3番目はNoneがでず4回連続なので4というように出力したいです。よろしくお願いします。


CC BY-SA 4.0
2022-11-06T10:01:50.853
92036
2022-11-06T13:12:12.837
2022-11-06T11:27:53.073
3054
55237
question
python
PythonでNoneが出る度にリセットしつつ、None以外の要素の出現数をカウントしたい

[code]

    >>> [i[::-1].index(None) if None in i else len(i) for i in zip(*listA)]
    [4, 0, 1, 4]
    
[/code]


CC BY-SA 4.0
2022-11-06T10:53:06.193
92037
2022-11-06T11:10:53.197
2022-11-06T11:10:53.197
47127
47127
92036
answer


  * 先頭から末尾までカウントする
  * `None` が出る度にカウントを `0` にリセットする

というのを逆に考えると、

  * 末尾から先頭方向へカウントしていく
  * `0` が出たらカウントを中止する

となります。後者は `0` が出て以降のカウントを省略できる分だけアルゴリズムとしては効率が良いはずです。これを書くと例えば下のようになります。

[code]

    listA = [[0, -1, 1, 0],
             [1, 0, -1, 1],
             [0, 1, None, 1],
             [-1, None, 0, 1]]
    
    width = len(listA[0])
    height = len(listA)
    
    result = [0] * width
    
    # 0 から (width - 1) までカウントアップ
    for w in range(width):
        # (height - 1) から 0 までカウントダウン
        for h in range(height - 1, -1, -1):
            # None が出たら現在のカウントを止める
            if listA[h][w] == None:
                break
            result[w] += 1
    
    print(f"{result=}")
    
[/code]


CC BY-SA 4.0
2022-11-06T11:22:41.527
92038
2022-11-06T11:29:08.167
2022-11-06T11:29:08.167
3054
3054
92036
answer


数値を求めるところを関数で記述し，縦に（列で）調べる部分をリスト内包表記で記述してみました。

[code]

    listA = [[ 0, -1, 1, 0],
             [ 1, 0, -1, 1],
             [ 0, 1, None, 1],
             [-1, None, 0, 1]]
    
    def cnt(lst):
        n = 0
        for v in lst:
            n = 0 if v is None else n + 1
        return n
    
    result = [cnt([listA[i][j] for i in range(len(listA))])
              for j in range(len(listA[0]))]
    
    print(result)
    
[/code]

[code]

    [4, 0, 1, 4]
    
[/code]


CC BY-SA 4.0
2022-11-06T13:12:12.837
92042
2022-11-06T13:12:12.837
54588
92036
answer