第59回【Python】重複要素の削除、【配列への副作用を伴う操作】条件を満たす要素のみの配列作成

現在取り組んでいるのは、paiza ラーニング問題集「配列活用メニュー」になります。

はじめに

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

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

59 回ともなれば、ゼロから勉強してみよう、という前提がおかしな気がします。そもそも、いろいろと使っていたわけで、ゼロからというのは誇張が過ぎるのかもしれません。しかし、ゼロから勉強し直すという心持ちで自分の血肉にしていこうと考えています。

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

重複要素の削除

配列 A の要素数 N と配列 A の各要素 A_1, A_2, …, A_N が与えられるので、同じ値の要素が 2 つ以上含まれないように A を加工した新たな配列 B を作成してください。
ただし、 A に同じ値の要素が 2 つ以上あった場合、それらのうち先頭の要素を B に採用するものとします。

同じ値の要素が 2 つ以上含まれないように A を加工した新たな配列 B の各要素を改行区切りで出力してください。
また、出力の末尾には改行を入れてください。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ N ≦ 100
・ 0 ≦ A_i ≦ 100 (1 ≦ i ≦ N)


5
1
2
3
5
2

新たな配列 B を作成しなければならない。さらに、与えられた順番を変えてはならない。

Python
N = int(input())
A = [int(input()) for _ in range(N)]
B = []
for a in A:
    if a not in B:
        B.append(a)
for b in B:
    print(b)
VBA
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
N = Cells(1, 1)
Dim A() As Integer, B() As Integer
ReDim A(N - 1)
For i = 0 To N - 1
    A(i) = Cells(i + 2, 1)
Next
For Each temp In A
    If Not dic.exists(temp) Then
        dic.Add temp, temp
    End If
Next
ReDim B(dic.Count - 1)
keys = dic.keys
For i = 0 To dic.Count - 1
    B(i) = keys(i)
Next
For Each v In B
    Debug.Print v
Next
Set dic = Nothing

【配列への副作用を伴う操作】条件を満たす要素のみの配列作成

配列 A の要素数 N と整数 K , 配列 A の各要素 A_1 … A_N が与えられるので、K 以上であるような配列 A の要素のみを要素として持つ配列 B を作成し、その要素を出力してください。 B の要素の順は A と同じにしてください。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ N ≦ 100
・ 0 ≦ A_i , K ≦ 100 (1 ≦ i ≦ N)


5 3
1
2
3
4
5

こちらも、新たな配列 B を作成しなければならない。さらに、与えられた順番を変えてはならない。副作用を伴う操作ってどういう意味だろう。副作用って怖いイメージが。

Python
N,K = map(int,input().split())
A = [int(input()) for _ in range(N)]
B = []
for a in A:
    if a >= K:
        B.append(a)
for b in B:
    print(b)
VBA
NK = Split(Cells(1, 1), " ")
N = Val(NK(0))
K = Val(NK(1))
Dim A() As Integer, B() As Integer
ReDim A(N - 1)
For i = 0 To N - 1
    A(i) = Cells(i + 2, 1)
Next
i = -1
For Each temp In A
    If temp >= K Then
        i = i + 1
        ReDim Preserve B(i)
        B(i) = temp
    End If
Next
For Each v In B
    Debug.Print v
Next

最後に

問題文に書かれている通りに、いろいろな条件に沿って新たな配列を作成するという作業は、実に手がかかる。Python の書く効率の良さには驚かされる。

VBA だったら(Python 以外の言語であったら)どれだけ面倒で長くなるんだろう、というコードをスッキリ書くことができる。paiza の模範解答にある java や C++ のコードと比べても違いは明らか。(java が 29 行、C++ が 23 行なのに対して、Python は 8 行)

実務でも利用することが多いので、しっかり身に付けて行きたいと思った。

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

Python学習,Python,paiza

Posted by LeoSaki