どの店がいちばん売れたか
コンビニチェーンの本部で、エリアの担当になりました。毎朝、50店舗の売上の一覧が届きます。
一覧は店舗番号の順です。「昨日いちばん売れた店」を知るには、全部を見比べる必要があります。
売上の大きい順に並べれば、一行目を見るだけで分かります。
このレッスンのゴール
メモ
データを並べかえて、その理由を説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ソート | データを決まった順に並べかえることです。 | |
| 昇順 | 小さい順です。 | |
| 降順 | 大きい順です。 | reverse=True |
| 選択ソート | 残りの中の最小を、前に移すことをくり返す方法です。 | |
| 入れかえ | 二つの要素の場所を交換することです。 |
学生が入力するセルは、このプレビューでは空白です。
並べると探せて、決められる
並べかえには、仕事の上で大きく三つの役目があります。
一つ目は、上位や下位がすぐ分かることです。二つ目は、二分探索が使えるようになることです。三つ目は、人が読んで比べやすくなることです。
Pythonでは sorted() か .sort() で並べかえます。
やってみよう: 売上を並べる
# 昨日の店舗別の売上(万円)です。店舗番号の順に並んでいます。
sales = [48, 63, 35, 71, 52]
ranked = sorted(sales, reverse=True) # 大きい順の新しいリストを作る
print("大きい順:", ranked)
print("1位の売上:", ranked[0], "万円")
print("元のリスト:", sales) # sorted は元のリストを変えない
sales.sort() # sort は元のリストそのものを並べかえる
print("sort のあと:", sales)
# reverse=True を消して、もう一度実行しましょう。並び方はどう変わりますか。
よくある間違い
注意
「sorted() を使えば、元のリストも並ぶ」と思う人がいます。sorted() は、並んだ新しいリストを返すだけです。元のリストそのものを並べたいときは、.sort() を使います。
選択ソートは最小を前に運ぶ
sorted() の中では、決まった手順が動いています。いちばん分かりやすい手順が選択ソートです。
まず、全体からいちばん小さい値を探し、先頭と入れかえます。次に、残りから最小を探して、2番目と入れかえます。
これを最後までくり返すと、小さい順に並びます。
やってみよう: 請求書を並べる
# 経理に届いた請求書の金額(円)です。
bills = [45000, 12000, 78000, 30000]
for i in range(len(bills)):
smallest = i
# まだ並んでいない部分から、いちばん小さい金額を探します。
for j in range(i + 1, len(bills)):
if bills[j] < bills[smallest]:
smallest = j
# 見つけた金額を、i の場所と入れかえます。
temp = bills[i]
bills[i] = bills[smallest]
bills[smallest] = temp
print(i + 1, "回目のあと:", bills)
# bills に 5000 を足して、もう一度実行しましょう。何回目まで続きますか。
例: 選択ソートを表で追う
| 回目 | 残りの中の最小 | 入れかえ | そのあとのリスト |
|---|---|---|---|
| はじめ | 45000, 12000, 78000, 30000 | ||
| 1 | 12000 | 45000と12000 | 12000, 45000, 78000, 30000 |
| 2 | 30000 | 45000と30000 | 12000, 30000, 78000, 45000 |
| 3 | 45000 | 78000と45000 | 12000, 30000, 45000, 78000 |
| 4 | 78000 | なし | 12000, 30000, 45000, 78000 |
学生が入力するセルは、このプレビューでは空白です。