

以下のような二次元配列があります。各配列内に数値が何個あるかカウントしたいのですが、どのようにすればよろしいでしょうか？

もし分かる方がいましたら、ご教示願います。

**対象の二次元配列:**

[code]

    two_array_list = [[0, 0, 0, 'None'], [1, 1, 'None', 'None'], ['None', 'None', 'None', 'None'],['None', 'None', 'None', 'None']]
    
[/code]

**目的の出力:**

[code]

    [3, 2, 0, 0]
    
    # 又は
    
    3
    2
    0
    0
    
[/code]


CC BY-SA 4.0
2021-09-19T14:33:11.580
82585
2021-09-21T00:51:46.090
2021-09-21T00:51:46.090
3060
47752
question
python
二次元配列の各配列内の指定要素をカウントしたい


こちらの記事とリスト内包表記を応用すれば出来るでしょう。  
[count how many of an object type there are in a list
Python](https://stackoverflow.com/q/25355705/9014308)

>
[code]

>     a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
>  
>     sum(isinstance(i, int) for i in a)
>  
[/code]

こんな感じになると思います。

[code]

    two_array_list = [[0, 0, 0, 'None'], [1, 1, 'None', 'None'], ['None', 'None', 'None', 'None'],['None', 'None', 'None', 'None']]
    result = [sum(isinstance(i, int) for i in a) for a in two_array_list]
    print(result)
    
[/code]

* * *

その上で、「数値」ということで`int`だけではなく`float`も含む場合はこちらの記事(の解決マークではない最初の方の回答)も適用すれば良いでしょう。  
[How to accept the input of both int and float
types?](https://stackoverflow.com/q/43564105/9014308)

>
[code]

>     if isinstance(num, (int, float)):
>         #do stuff
>  
[/code]

こんな感じになるでしょう。

[code]

    two_array_list = [[0, 0, 0, 'None'], [1, 2.5, 'None', 'None'], ['None', 'None', 'None', 'None'],['None', 'None', 'None', 'None']]
    result = [sum(isinstance(i, (int, float)) for i in a) for a in two_array_list]
    print(result)
    
[/code]


CC BY-SA 4.0
2021-09-19T14:53:54.507
82586
2021-09-19T14:53:54.507
26370
82585
answer


`int(True) == 1`, `int(False) == 0` である事を利用して `sum()` を取ります。

[code]

    from numbers import Number
    
    two_array_list = [
      [0, 0, 0, 'None'],
      [1, 1, 'None', 'None'],
      ['None', 'None', 'None', 'None'],
      ['None', 'None', 'None', 'None']
    ]
    
    counts = [sum(isinstance(v, Number) for v in a) for a in two_array_list]
    print(counts)
    
    #=>
    [3, 2, 0, 0]
    
[/code]

> 私:  
>  リストに含まれるのは数値と 'None'(文字列)だけなのでしょうか？
>
> hideto.T さん:  
>  数値と文字列のみです。

そうなりますと `isinstance()` を使う必要はなく、以下の様にできます。

[code]

    counts = [sum(v != 'None' for v in a) for a in two_array_list]
    
[/code]


CC BY-SA 4.0
2021-09-19T14:54:05.027
82587
2021-09-20T01:49:45.907
2021-09-20T01:49:45.907
47127
47127
82585
answer


.countが使えると思います。

例えば、以下の様ではどうですか？

[code]

    two_array_list = [[0, 0, 0, 'None'], [1, 1, 'None', 'None'], ['None', 'None', 'None', 'None'],['None', 'None', 'None', 'None']]
    
    for list in two_array_list:
        n = list.count("None")
        print (len(list) - n)
    
[/code]

「数値が何個」を数える代わりに、  
「Noneが何個」を数えて、その個数を各listから引いた数を計算しています。


CC BY-SA 4.0
2021-09-19T15:00:02.653
82588
2021-09-19T15:00:02.653
11048
82585
answer