第87回【Python】集合の探索、重複の削除

現在取り組んでいるのは、paiza ラーニング問題集「データセット選択メニュー」になります。

はじめに

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

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

自分の中に回答が存在するであろう内容について、議論を吹っ掛けてくる偉い人がいます。論理的に順序立てて話しても、求める回答でない限りは認めようとしてくれません。求められている回答が意にそぐわないものであることは見えているので、ひたすら我慢して議論を続けます。とてもしんどい。

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

集合の探索

N 個の要素からなる数列 A と、整数 B が与えられます。B が A に含まれているかどうかを判定してください。B が A に含まれているなら「Yes」を、含まれていないなら「No」を出力してください。

N B
A_1 A_2 ... A_N

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

・ 1 ≦ N ≦ 100
・ 1 ≦ B ≦ 100
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)
・ i ≠ j ならば A_i ≠ A_j


入力例

5 4
1 2 3 4 5

出力例

Yes

なんだか急に逆戻り? ただし、ここでは集合を使えば早そう。

Python
N,B = map(int,input().split())
A = { int(x) for x in range(N) }
if B in A:
    print('Yes')
else:
    print('No')
VBA
NB = Split(Cells(1, 1), " ")
a = Split(Cells(2, 1), " ")
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(a)
    If Not dic.exists(a(i)) Then
        dic.Add a(i), a(i)
    End If
Next
If dic.exists(NB(1)) Then
    Debug.Print "Yes"
Else:
    Debug.Print "No"
End If

VBA だと .NET Framework を利用しないと集合が使えないので、連想配列を利用した。

重複の削除

N 個の要素からなる数列 A が与えられます。数列 A は昇順にソートされています。A の重複した要素を取り除いて昇順に出力してください。

N
A_1 A_2 ... A_N

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

・ 1 ≦ N ≦ 100
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)
・ i < j ならば A_i ≦ A_j


入力例

6
1 2 3 3 4 5

出力例

1 2 3 4 5

「昇順に」というのがポイントになりそう。

Python
N = int(input())
A = [int(x) for x in input().split()]
print(*sorted(set(A),key=A.index))

というのを書いたのだが、模範解答はもっと簡潔だった。順番は保持しないけれど、最初に定義する順番は変わらない、のかな?

Python(模範解答)
N = int(input())
A = { int(x) for x in input().split() }
print(' '.join(map(str,A)))
VBA
N = Cells(1, 1)
a = Split(Cells(2, 1), " ")
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(a)
    If Not dic.exists(a(i)) Then
        dic.Add a(i), a(i)
    End If
Next
Debug.Print Join(dic.keys, " ")

最後に半角スペースがあったり改行されてなかったりは目を瞑ってください。

最後に

VBA にも Join があったんだ、という新たな発見が。ここまでやってきて、よく気づかなかったなぁ、自分。過去に書いたコードでも、Join を知ってたら、もっと簡潔にできてたやつがあったかもしれない。知らないって罪ですね。

Python の学習のつもりが、VBA の方でも新しい発見があって、美味しさ 2 倍のお勉強になっています。まだまだ VBA も現役バリバリなので。Microsoft 社が VBA はいらんって言ったみたいですが、断固として反対しますよ。

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

Pythonpaiza,学習,Python

Posted by LeoSaki