第37回【Python】配列のソート、配列の反転
現在取り組んでいるのは、paiza ラーニング問題集「配列メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 37 回目です。
なかなか忙しくてキャンプにあまり行けていません。まぁ、キャンプ場でも PC 開いて仕事してるか勉強してるかなのですが。それでも、大自然の中でやるのと家にこもってやるのとでは気分が違うってもんです。
それでは、今日も頑張ってみようと思います。
配列のソート
1 行目に整数 N が与えられます。
2 行目に N 個の整数 a_1, a_2, …, a_N が与えられます。
N 個の整数を小さい順にソートし、改行区切りで出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・N は 1 以上 10 以下の整数
・a_i (1 ≦ i ≦ N) は 1 以上 10 以下の整数
5
5 4 3 2 1
基本情報や応用情報で、様々なソートの種類を勉強しました。そのアルゴリズムも突っ込んで勉強したものです。しかし、便利な関数があるのだからそれを使います。
Python
N = int(input())
L = list(map(int,input().split()))
L.sort()
print(*L,sep="\n")
元のリストは不要だから、破壊的なソートである sort 関数を使う。元のリストが必要であれば、sorted 関数を使う。使える場面と使えない場面をちゃんと判断しないといけない。
VBA
N = Cells(1, 1)
L = Split(Cells(2, 1), " ")
For i = 0 To UBound(L)
L(i) = Val(L(i))
Next
For i = UBound(L) To LBound(L) Step -1
For j = LBound(L) To i - 1
If L(j) > L(j + 1) Then
tmp = L(j)
L(j) = L(j + 1)
L(j + 1) = tmp
End If
Next
Next
For Each li In L:
Debug.Print li
Next
面倒なので、一番簡単なバブルソートを使用。件数が多くなるのであれば、クイックソートをちゃんと書くべき?
配列の反転
1 行目に整数 N が与えられます。
2 行目に N 個の整数 a_1, a_2, …, a_N が与えられます。
N 個の整数の順番を反転させ、改行区切りで出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・N は 1 以上 10 以下の整数
・a_i (1 ≦ i ≦ N) は 1 以上 10 以下の整数
5
1 5 2 4 3
これも、便利な関数を使えば一発で解決できる問題。
Python
N = int(input())
L = list(map(int,input().split()))
L.reverse()
print(*L,sep="\n")
普段、LeoSaki(旦那)がよく使うのはこっち。slice 演算子をもっと極めたいものだ。
Python
N = int(input())
L = list(map(int,input().split()))
print(*L[::-1],sep="\n")
VBA
N = Cells(1, 1)
L = Split(Cells(2, 1), " ")
Dim li() As Long
ReDim li(N - 1)
j = 0
For i = 0 To UBound(L)
L(i) = Val(L(i))
Next
For i = UBound(L) To 0 Step -1
li(j) = L(i)
j = j + 1
Next
For Each num In li:
Debug.Print num
Next
美しくない。けれど、頭の体操にはなった・・・気がする。
最後に
LeoSaki(旦那)の書いたものがすべて正解というわけでなく、書き方はたくさんあるのだと思う。できるだけ他の人が見てわかりやすいコードを目指したい。
VBA で書くというのは、良い頭の体操になっている。今回のソートとか、ワークシートファンクションを使うこともできるのだけれど、365 でないと使えなかったり。会社が 365 なので試してみたら、Python と同じくらいの行数にまとめることができた。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません