第16回【Python】二次元配列の出力、二次元配列での要素の検索

現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 16 回目です。

今日はルナちゃんとレオくんが LeoSaki(旦那)の膝の取り合いをしています。キーボードを打つ手の上だってルナちゃんとレオくんのもの。LunaSaki(嫁)が座った膝の上はルナちゃんとレオくんのもの。

それでは、今日も頑張ってみようと思います。

二次元配列の出力

整数 N , K と N 行 K 列 の二次元配列 A が与えられるので、その配列をそのまま出力してください。

そのまま出力するだけなら・・・これじゃダメですか?

Python
N,K = map(int,input().split())
for _ in range(N):
    print(input())

冷静になろう。二次元配列 A が与えられると言っている。標準入力から二次元配列 A を受け取って、それをそのまま出力しろ、という問題。さらに、二重ループがテーマなのだ。ほら、タブチ先生が近づいてくる。

急いで「二重ループ」というテーマと「問題文」に忠実になろう。

Python
N,K = map(int,input().split())
A = [input().split() for _ in range(N)]
for i in range(N):
    for j in range(K):
        if j == K - 1:
            print(A[i][j])
        else:
            print(A[i][j],end=" ")

二重ループ内でやることは前回やったことと同じ。内包表記での二重配列の作り方を理解することが重要。

Python(内包表記でやっていること)
A = []
for _ in range(N):
    A.append(input().split())

さて、VBA でも書いてみる。

VBA
Dim A As Variant
S = Split(Cells(1, 1), " ")
N = Val(S(0))
K = Val(S(1))
A = Array()
For i = 0 To N - 1
    ReDim Preserve A(i)
    A(i) = Split(Cells(i + 2, 1), " ")
Next
For i = 0 To N - 1
    For j = 0 To K - 1
        If j = K - 1 Then
            Debug.Print A(i)(j)
        Else
            Debug.Print A(i)(j) & " ";
        End If
    Next
Next

いきなり長く面倒なコードになってしまった。Python での内包表記は便利だなぁ。

要素の数が分かっているのだから静的配列にすればいい、というご意見もあるかと思いますが、拡張性を考えて動的配列でやってます。

二次元配列での要素の検索

整数 N , K と N 行 K 列 の二次元配列 A が与えられます。 A の要素のうち、1 要素だけ 1 になっている要素があるので、その要素の行と列を出力してください。

「1 要素だけ 1 になっている」の 1 が、整数型か文字列型かの指定がない。

Python(1 が文字列型)
N,K = map(int,input().split())
A = [input().split() for _ in range(N)]
for i in range(N):
    for j in range(K):
        if A[i][j] == "1":
            print(i+1,j+1)
Python(1 が整数型)
N,K = map(int,input().split())
A = [[int(x) for x in input().split()] for _ in range(N)]
for i in range(N):
    for j in range(K):
        if A[i][j] == 1:
            print(i+1,j+1)

指定がないので、どっちでも良いのかな。

VBA でも書いてみよう。

VBA(1 が文字列型)
Dim A As Variant
S = Split(Cells(1, 1), " ")
N = Val(S(0))
K = Val(S(1))
A = Array()
For i = 0 To N - 1
    ReDim Preserve A(i)
    A(i) = Split(Cells(i + 2, 1), " ")
Next
For i = 0 To N - 1
    For j = 0 To K - 1
        If A(i)(j) = "1" Then
            Debug.Print i + 1 & " " & j + 1
        End If
    Next
Next
VBA(1 が整数型)
Dim A As Variant
S = Split(Cells(1, 1), " ")
N = Val(S(0))
K = Val(S(1))
A = Array()
For i = 0 To N - 1
    ReDim Preserve A(i)
    A(i) = Split(Cells(i + 2, 1), " ")
    For j = 0 To K - 1
        A(i)(j) = Val(A(i)(j))
    Next
Next
For i = 0 To N - 1
    For j = 0 To K - 1
        If A(i)(j) = 1 Then
            Debug.Print i + 1 & " " & j + 1
        End If
    Next
Next

Python で書いたものに合わせてみると、とてもとても長くなってしまった。

【If A(i)(j) = 1 then】 を 【If Val(A(i)(j)) = 1 then】 にすれば、上段ですべてを変換しておく必要はないのだろうけれど。それでも長くなってしまうのは否めない。

最後に

Python で二次元配列を標準入力から受ける方法が、とても簡単であることが実感できた。

AWS Lambda を書いていると、S3 に置いた CSV からデータを受けて処理をすることが多い。過去に LeoSaki(旦那)が書いた Lambda 関数を見ると、VBA の見た目のようなコードが散見される。paiza で学習を始めてからは、反省しきりだ。

もっと見やすくわかりやすいコードを書くことができるように、学習を続けたいと思う。

ルナちゃんとレオくんのおかげで完全に足の感覚がなくなったので、本日はここまで!

引き続き、お付き合いよろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki