Pythonでうるう年ループと西暦と和暦の変換

この記事を読むとことで、

・うるう年をIF文と剰余演算子%で判定
・Forループ
・リスト
・リストの末尾に要素を追加

・西暦と和暦の対応

について学習できます。
うるう年はプログラミングを学ぶ上で重要な論点です。

Pythonのコードで、開始年から終了年までの間のうるう年を調べて、和暦と対応付けます。

例えば、私が生れた1977年から、この記事を書いている2025年まで、うるう年が何回あったのか、その年の西暦と和暦の対応を付けて元号も表示出来ます。

まず、うるう年の定義ですが、

4で割れて且つ100で割れない、または400で割れる

になります。

2025年(令和7年)は4で割れないので、うるう年ではありません。
2100年は4で割れますが、100で割れるのでうるう年ではありません。

具体的に、1977年(昭和52年)から2025年(令和7年)までの期間のうるう年を見ていきます。

標準入力を使って、開始年に1977、終了年に2025を入力します。
まず、標準入力で、開始年(yearStart)と終了年(yearLast)を入力するコードです。

#開始年の入力
print("開始年を西暦で入力して下さい -->>",end="")
yearStart=int(input())

#終了年の入力
print("終了年を西暦で入力して下さい -->>",end="")
yearLast=int(input())

次に、うるう年だった場合にリストleapArrayに追加するコードです。

この処理で、うるう年の条件に当てはまる、「4で割り切れて100で割れない」または、400で割れると言う条件が当てはまったら、その年をリストleapArrayに追加します。

リストに追加する部分のコードです。

leapArray.append(i)

また、len(leapArray)で配列の長さを求めることによって、うるう年が何回あったのかをカウントします。

#開始年の入力
print("開始年を西暦で入力して下さい -->>",end="")
yearStart=int(input())

#終了年の入力
print("終了年を西暦で入力して下さい -->>",end="")
yearLast=int(input())

#うるう年を格納するリストを用意
leapArray=[]

#ループでうるう年に該当する年をリストに格納する
for i in range(yearStart,yearLast+1):
  if (i%4==0 and i%100!=0) or (i%400==0):
    leapArray.append(i)

#リストの長さはうるう年が合った回数になる
num=len(leapArray)


#うるう年が追加されたリストを表示させる
for year in leapArray:
  print(year)

print("うるう年は【"+str(num)+"】回ありました。")

ここまでの実行結果です。

最後に西暦年から和暦に変換する処理を行います。

昭和は1926年からなので、西暦年から1925を引きます。
平成は1989年からなので、西暦年から1988を引きます。
令和は2019年からなので、西暦年から2018を引きます。

西暦が格納されたyearから必要な年数を引いた分を変数japanに格納します。

便宜上、 昭和64年と平成31年はそれぞれ平成と令和の元年に致しました。

#開始年の入力
print("開始年を西暦で入力して下さい -->>",end="")
yearStart=int(input())

#終了年の入力
print("終了年を西暦で入力して下さい -->>",end="")
yearLast=int(input())

#うるう年を格納するリストを用意
leapArray=[]

#ループでうるう年に該当する年をリストに格納する
for i in range(yearStart,yearLast+1):
  if (i%4==0 and i%100!=0) or (i%400==0):
    leapArray.append(i)

#リストの長さはうるう年が合った回数になる
num=len(leapArray)


#うるう年が追加されたリストを西暦と和暦で表示する
for year in leapArray:
  if year>=2019:
    japan=year-2018
    wareki="令和"

  elif year>=1989 and year<2019:
    japan=year-1988
    wareki="平成"

  else:
    japan=year-1925
    wareki="昭和"  
    
  print(str(year)+"年 "+"("+wareki+str(japan)+"年)")

print("うるう年は【"+str(num)+"】回ありました。")

実行結果です。

うるう年については他の言語でも記事を書きました。
アセンブラ(フローチャート付き)
C言語

お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会2025です。

ご精読ありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

PythonでIF文使って関西人度と関東人度診断をチェック

この記事を読むことで、

IF文
標準入力
比較演算子
関数

の練習になります。

例として「関西人度、関東人度」診断を用います。

標準入力や比較演算子を使い、あなたの関東人ポイントがいくつで、関西人ポイントがいくつで、どちらが多いか比較して【関東人】または【関西人】を判定します。

コードのメンテナンス目的で関数の基本的な説明も掲載しました。

参考にした診断はコチラです。
あなたが「関東人」か「関西人」かを見極める10の質問 隠しても無駄だぞ!!

こちらをヒントにしてPythonでアレンジしてみました。

まず、私(東京都出身)がやってみたコチラの診断結果です。

この診断をPythonでプログラミングしてみました。
質問には半角の1か2を入れて回答するので標準入力を用います。
標準入力で数字を扱う場合は、このように記述します。

#標準入力で数字を入れる
ans=int(input())

これで、ansに標準入力で1または2の解答を入力します。
それでは、1つ分の診断プログラムを作成致します。

#関東人・関西人の質問
print("あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#関東人・関西人の分岐処理
if ans==1:
  print("あなたは【関東人】です。")
elif ans==2:
  print("あなたは【関西人】です。")
else:
  print("半角数値の1か2を押して下さい。")

質問の部分のprint文に使われている「\n」は改行はです。
「\」のバックスラッシュは、macの場合は「option」+「¥」です。

また、

if ans==1:

と「==」としているのは、「=」一つだけだと代入になってしまうので、ansが1と等しいか判定する際には、「==」とイコールを2つ並べて書きます。

このコードでは、「あなたが道を教える時は?」と言う質問に対して、
「1:この横断歩道を渡って・・・」と答えるか、
「2:そこをガ〜〜〜〜って行って・・・」と答えるかで処理が分岐されます。
1または2の該当する方を選びますが、それ以外の回答を選んだ場合のメッセージも表示されています。

1を選んだ場合

2を選んだ場合

それ以外(999)などを押してしまった場合

質問が1つだけだと本当に関東人か関西人か分かりづらいので、関東に該当する答えを選んだ場合は、関東人ポイント(eastPoint)が加算され、関西に該当する答えを選んだ場合は、関西人ポイント(westPoint)が加算され、どちらが多いか比較するプログラムに改良してみます。

まず、この部分で各ポイントを0で初期化します。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0

また、「+=」と、加算代入演算子で使って加えています。

if ans==1:
  eastPoint+=1

また、トータルで関東人ポイントと関西人ポイントのどちらが多いかの計算結果による判定のコードはこちらになります。
同じ場合は「ハイブリッド」にしました。

#関東人か関西人かの判定
if eastPoint>westPoint:
  msg="\nあなたは【関東人】です。"
elif westPoint>eastPoint:
  msg="\nあなたは【関西人】です。"
else:
  msg="\nあなたは【ハイブリット】です。"

関東人か関西人かハイブリットかを変数msgに入れて、最後にprint文で出力することにより、printと書く分量を節約でき、コードが簡潔になりました。

それでは、質問1と質問2までのコードを掲載致します。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0


#質問1
print("質問1:あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint+=1
elif ans==2:
  westPoint+=1
else:
  print("半角数値の1か2を押して下さい。")


#質問2
print("\n質問2:納豆は?")
print("1:「くさい!!!」\n2:「美味しい」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  westPoint+=1
elif ans==2:
  eastPoint+=1
else:
  print("半角数値の1か2を押して下さい。")

#関東人か関西人かの判定
if eastPoint>westPoint:
  msg="\nあなたは【関東人】です。"
elif westPoint>eastPoint:
  msg="\nあなたは【関西人】です。"
else:
  msg="\nあなたは【ハイブリット】です。"


print("あなたは"+msg+"\nあなたのeastPointは「"+str(eastPoint)+"」、westPointは「"+str(westPoint)+"」でした。")

関東人の場合の実行結果

関西人の場合の実行結果

ハイブリットの場合の実行結果

これでもプログラムは動くのですが、このコードをじっくりと眺めてみて、ちょっと冗長な部分がございました。

例えば、

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint+=1
elif ans==2:
  westPoint+=1
else:
  print("半角数値の1か2を押して下さい。")

と、それぞれのポイントを加算している箇所がございます。

今は質問が2つだけですが、今後質問が増える時にちょっとコードの量が多いので、ここの部分を関数にして見ました。加算するポイントを引数にして、関数add_pointで加算処理をしています。

#ポイントを加算
def addPoint(x):
  return x+1

xの中に加算するポイント(eastPointまたはwestPoint)を入れて、returnで1加えた値を戻り値としています。

呼び出し元です。

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint=addPoint(eastPoint)
elif ans==2:
  westPoint=addPoint(westPoint)

また、1か2以外の数字を入れた場合は、関数otherを定義しました。

#半角の1,2以外が押されてしまった場合
def other():
  print("半角数値の1か2を押して下さい。")

呼び出し元です。
(elseの所)

else:
  other()

更に、関東か関西か分岐をする処理の箇所で、この部分を関数judgeとして定義しました。

#判定
def judge(e,w):
  if e>w:
    return "\nあなたは【関東人】です。"
  elif w>e:
    return "\nあなたは【関西人】です。"
  else:
    return "\nあなたは【ハイブリット】です。"

判定の呼び出し元です。

#関東人か関西人かの判定
msg=judge(eastPoint,westPoint)

関数judgeを呼び出す際に引数として、eastPointとwestPointを入れて、戻り値としてmsgにポイントが多い方の文字列が入る様にしました。

流れとして、呼び出し元のeastPointが関数judgeの仮引数のeに入り、呼び出し元のwestPointが関数judgeの仮引数のwに入って、関東、関西、ハイブリッドの判定をして、その文字列を戻り値として呼び出し元のmsgに入ります。

ここまでをまとめたコードがこちらになります。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0

#ポイントを加算
def addPoint(x):
  return x+1

#半角の1,2以外が押されてしまった場合
def other():
  print("半角数値の1か2を押して下さい。")

#判定
def judge(e,w):
  if e>w:
    return "\nあなたは【関東人】です。"
  elif w>e:
    return "\nあなたは【関西人】です。"
  else:
    return "\nあなたは【ハイブリット】です。"


#質問1
print("質問1:あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint=addPoint(eastPoint)
elif ans==2:
  westPoint=addPoint(westPoint)
else:
  other()


#質問2
print("\n質問2:納豆は?")
print("1:「くさい!!!」\n2:「美味しい」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  westPoint=addPoint(westPoint)
elif ans==2:
  eastPoint=addPoint(eastPoint)
else:
  other()


#関東人か関西人かの判定
msg=judge(eastPoint,westPoint)


print("あなたは"+msg+"\nあなたのeastPointは「"+str(eastPoint)+"」、westPointは「"+str(westPoint)+"」でした。")


お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会2025です。

ご精読ありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

コロナ禍のストレス解消、ハッカ愛からハッカー!?

この記事では、コロナ自粛疲れをリフレッシュしたい時に是非オススメなハッカ(ニホンハッカ)を紹介しています。
不要不急の外出自粛に都道府県越えを避けるなど、ストレスをスッキリ系のアロマで解消したい方には、お役立て頂けるかも知れません。

■ 関連記事 ■
メインメニューに戻る
風呂グラミング(入浴剤紹介)
アロマでゴキブリを追い出せ

タイトルに「ハッカー」とありますが、ハッカーと言っても、コンピュータのハッカーのことではありません。
ハッカ油を愛してしまいました。

子どもの頃、喘息の発作がしんどくなるとハッカのニオイを嗅いで症状を治めたことがあります。

※全てのぜん息の患者の方にハッカが効くという訳ではありません。

その影響か、大人になってごく稀にしか喘息の発作が出なくなった今でも、ハッカへの敬愛が溢れています。

そこで、ハッカの中でもマイルドでお気に入りのメーカーを紹介します。

※回し者では無く、ファンです。
北見ハッカ通商さんの製品のファンになりました。
その中で私が購入して使ってみた製品のレビュを致します。

まずは入浴剤です。
コロナのストレス、グルメでプチ贅沢すると太りそうなので、入浴剤ぐらいは良いの使いたい。
詳しくは、風呂グラミング(入浴剤紹介)をご参照ください。

Mint Creamです。
ミントの入った馬油です。
風呂上りに頭皮に付けると、スッキリします。
受験勉強や風呂上りのプログラミングにもおススメです。

ハッカ油です。
これはお掃除スプレーに使っています。
ハッカは虫よけ効果もあるので、自分のストレス解消と一石二鳥で使っています。

■ 関連記事 ■
メインメニューに戻る
風呂グラミング(入浴剤紹介)
アロマでゴキブリを追い出せ

Python二次元リストで、まじ卍

Python自作サンプル集へ
これからプログラミングを始める方へ
メインメニューに戻る
息抜きに、写真で癒し(=^・^=)

Pythonの進捗状況(私のロードマップ)

おはこんばんにちは!
うにゃうにゃエンジニアの猫です(=^・^=)

昭和生まれが恥ずかしくて言えない言葉のひとつに、
「まじ、卍(まんじ)」があるのではないでしょうか。

私も言えないです。
これだから、おっさん、おばはんは、って反応されそうですし・・・。

という訳で、言えないのだったらPythonの二次元リストで作っちゃえと思って、
ループを使って卍を作りました。

縦13(行番号0~12)、横25(列番号0~24)の二次元リストです。
卍の線が入る所にドルマークを付けました。

なぜドルマークかって言ったら、自分に足りない物の1つだからです。
そういうのはプログラミングで埋めようかなと。

コードはこんな感じです。
Pythonでは改行する所に\(バックスラッシュ)を入れて改行できるとか。
それで、コードが見やすく成ったと思います。

manjimap = [[” ” for i in range(25)] for j in range(13)]

for i,line in enumerate(manjimap):

for j,dot in enumerate(line):
if (i==0 and j<=13) or (i==12 and j>=13) or j==13\
or (j==24 and i<=6) or (j==0 and i>=6) or i==6:
print(“$”,end=””)

else:
print(dot, end=””)

print()

実行結果です。

ここまで読んで下さってありがとうございました。
愛しています。

Python自作サンプル集へ
これからプログラミングを始める方へ
メインメニューに戻る
息抜きに、写真で癒し(=^・^=)

Python二次元配列ドット絵でインベーダーを書いてみた。

この記事を読むことで、ループとIF文を組み合わせて、Pythonでドット絵を描くことが出来ます。
今回扱うドット絵はインベーダーゲームです。


配列の要素が1だったら「□」、0だったら「半角スペース」をドットとして出力します。
二次元リストを扱うので、列の最後の所まで行ったらドットを出力したのちに改行します。

要素の中身(ドット)と、リストの添字(i,j)を扱うので、enumerateを使います。
リストの最後の要素は、リストの添字が0から始まるので、リストの長さ-1になります。jがリストの長さ-1だったらドットを出力した後に改行をします。

サイトマップはこちらから

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

おはこんばんにちは!
うにゃうにゃエンジニアの猫です(=^・^=)
年齢バレバレですが、子どもの頃「インベーダーゲーム」というものをやったことがあります。

そのインベーダーのキャラクターを二次元リストを使ってドット絵で描いてみます。

実行結果とコードです。

コードの詳細を見ていきましょう。
まず、ドット絵を表す二次元リストをこのように作りました。

#インベーダーのドット絵の元になる二次元リスト
invader=[
[0,0,1,0,0,0,0,0,1,0,0],
[0,0,0,1,0,0,0,1,0,0,0],
[0,0,1,1,1,1,1,1,1,0,0],
[0,1,1,0,1,1,1,0,1,1,0],
[1,1,1,1,1,1,1,1,1,1,1],
[1,0,1,1,1,1,1,1,1,0,1],
[1,0,1,0,0,0,0,0,1,0,1],
[0,0,0,1,1,0,1,1,0,0,0]
]

リストの「列の」長さは下記のように求めます。
invader[0]としているのは、リストの長さは各行同じなので、リストinvaderの1行目の、すなわちinvader[0]の長さを求めます。
リストの添字が0から始まるので-1しています。

num=len(invader[0])-1

numに列-1が入りました。

ループの中でIF分岐を使ってドット絵を書いていきます。
行をi、列をjとしています。

jがnumと等しく無い時(j!=num)、1行分のドットを表示させるので、改行させません。
jがnumと等しい時(j==num)は、ドットを出力してから改行しています。

jがnumと等しくない、and(且つ)、ドットが1の時は「□」を出力、ドットが0の時は「半角スペースを出力」しています。

jがnumと等しい、且つ、ドットが1の時、0の時はドットの出力後に改行しています。

for i,chara in enumerate(invader):
   for j,dot in enumerate(chara): 
        if j!=num and dot==1:
                print('□',end='')     
        elif j!=num and dot==0:
                print(' ',end='')    
        else:
            if j==num and dot==1:
                print('□')
            elif j==num and dot==0:
                print(' ')


ここまでの全コードは、この様になります。


#インベーダーのドット絵の元になる二次元リスト
invader=[
[0,0,1,0,0,0,0,0,1,0,0],
[0,0,0,1,0,0,0,1,0,0,0],
[0,0,1,1,1,1,1,1,1,0,0],
[0,1,1,0,1,1,1,0,1,1,0],
[1,1,1,1,1,1,1,1,1,1,1],
[1,0,1,1,1,1,1,1,1,0,1],
[1,0,1,0,0,0,0,0,1,0,1],
[0,0,0,1,1,0,1,1,0,0,0]
]

#インベーダーの二次元リストの列数を求める
num=len(invader[0])-1

#二次元リストの要素が1の時に「■」、0の時は全角スペース
for i,chara in enumerate(invader):
   for j,dot in enumerate(chara): 
        if j!=num and dot==1:
                print('□',end='')     
        elif j!=num and dot==0:
                print(' ',end='')    
        else:
            if j==num and dot==1:
                print('□')
            elif j==num and dot==0:
                print(' ')

最後までお読みいただきありがとうございました(=^・^=)mm。。。

■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。

Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

サイトマップはこちらから

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

Pythonのリスト・辞書を昇順、降順に並び替えて、sort及びsortedの処理時間を計測[Alexandros]の曲の長さ順に表示

この記事を読むことによって、Pythonでリストを昇順、降順に並べ替えるsortと、新たにリストを定義して並べ替えるsortedの書き方について違いについて学べます。
また、両者の処理時間を比較することで、timeモジュールをインポートした書き方、処理時間の計算の仕方を学べます。

具体例として、好きなバンドの曲の長さの入ったリストを用います。
カラオケのオハコで、ドロスこと[Alexandros]の中でも特に私がよく歌う曲(現在コロナ禍の為、カラオケは自粛中)をリストにして、sortによる昇順、降順、sortedについてコードを書いて実行していきます。

サイトマップはこちらから

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

今回使用する曲のリストです。

4:08 ワタリドリ 
3:15 FamousDay
4:27 RunAway
4:46 SNOW SOUND

これをこの様なリストを作ってみました。

DROS=[‘4:27 RunAway’,’4:08 ワタリドリ’,’3:15 FamousDay’,’4:46 SNOWSOUND’]

単純なコードを書いて、このまま出力してみます。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

print('そのまま出力-->>>>>')
print(DROS)

では、出力結果です。


では、このリストを昇順にします。
カラオケの残り時間があまり無い時には短い曲から歌うことに使えそうですね。

昇順にするにはこの様に書きます。

DROS.sort()

ここまでのコードです。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

print('そのまま出力-->>>>>')
print(DROS)

#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)

辞書を昇順にした実行結果です。

では、降順の出力は、この様に書きます。

DROS.sort(reverse=True)

reverseはデフォルトでは、Falseになっています。
これをTrueにすることによって、リストを降順にしています。

ここまでのコードです。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

print('そのまま出力-->>>>>')
print(DROS)

#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)

#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)

リストを降順にした出力結果です。

これで、この記事を終わりにしても良いのですが、このリスト時間と曲があるので、一層のこと辞書にした方が良いのでは、と思われますよね。
そこで、辞書に作り替えてみます。

この様な辞書を作りました。

dict_DROS={‘4:27′:’RunAway’,’4:08′:’ ワタリドリ’,’3:15′:’FamousDay’,’4:46′:’SNOWSOUND’}

これまでのコードと出力結果です。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

print('そのまま出力-->>>>>')
print(DROS)

#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)

#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)

#辞書を定義
dict_DROS={'4:27':'RunAway','4:08':' ワタリドリ','3:15':'FamousDay','4:46':'SNOWSOUND'}
#辞書をそのまま出力する処理
print('【辞書】を【そのまま】出力-->>>>>')
print(dict_DROS)

辞書をそのまま出力した結果です。

では、同様に辞書を昇順にしてみます。

この書き方はエラーになる
dict_DROS.sort()

このエラー分をざっくりとした日本語に訳すと、「辞書ではsortは使えないよ!!」
という意味です。

つまり、sortはリストでは使えるけれど、辞書では使えないんですよね。

そこで、sortedを使って、items()を加えます。キーと値の両方をタプルとして出力するのに、items()も使って、この様にコードを書き直します。

new_dict_DROS=sorted(dict_DROS.items())

簡単に書くと、並び替えた辞書を新しい辞書に代入して、その新しい辞書を出力しています。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

print('そのまま出力-->>>>>')
print(DROS)

#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)

#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)

#辞書を定義
dict_DROS={'4:27':'RunAway','4:08':' ワタリドリ','3:15':'FamousDay','4:46':'SNOWSOUND'}

#辞書をそのまま出力する処理
print('【辞書】を【そのまま】出力-->>>>>')
print(dict_DROS)

#辞書を昇順にする処理
new_dict_DROS=sorted(dict_DROS.items())
print('【辞書を昇順】に出力-->>>>>')
print(new_dict_DROS)

辞書を昇順にする処理の結果です。


今度は辞書を降順にしてみます。この様にコードを追記します。
こちらもreverseをTrueにします。

new_dict_DROS=sorted(dict_DROS.items(),reverse=True)

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

print('そのまま出力-->>>>>')
print(DROS)

#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)

#【降順】にする処理
DROS.sort(reverse=True)
print('【降順】に出力-->>>>>')
print(DROS)

#辞書を定義
dict_DROS={'4:27':'RunAway','4:08':' ワタリドリ','3:15':'FamousDay','4:46':'SNOWSOUND'}

#辞書をそのまま出力する処理
print('【辞書】を【そのまま】出力-->>>>>')
print(dict_DROS)

#辞書を昇順にする処理
new_dict_DROS=sorted(dict_DROS.items())
print('【辞書を昇順】に出力-->>>>>')
print(new_dict_DROS)

#辞書を降順にする処理
new_dict_DROS=sorted(dict_DROS.items(),reverse=True)
print('【辞書を降順】に出力-->>>>>')
print(new_dict_DROS)

辞書を降順にする出力結果です。

sortedはリストでも辞書でも使えるんなら、sortっていらなくね?
って思いましたので、なぜsortが存在するのか処理時間の観点から見てみます。

一旦分かりやすくする為に、リストの定義と昇順のコードのみを掲載します。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

#【昇順】にする処理
DROS.sort()
print('【昇順】に出力-->>>>>')
print(DROS)


このコードに追記して、sortを使った場合とsortedを使った場合の処理時間の違いを求めます。

timeモジュールをインポートして、sortの処理の直前にこの様に書くと処理開始前の時刻が求められます。

startTime1=time.time()

このコードで処理開始前の時刻が求められます。
この時刻とは、1970年1月1日0時0分0秒からの経過秒数です。

その為、処理の直後にはにendTime1を同様に記述して、下記の様にstartTime1とendTime1の差を求めることによって、処理にかかる時間を求めることが出来ます。

Time1=endTime1-startTime1


sortedの場合は、startTime2とendTime2の差を同様にしてを求めます。
また、どっちの方がどれだけ時間が短かったのかをIF文での分岐で比較を使って求めたので、ちょっとコードが長くなりました。

#時間を計測する為、にtimeモジュールをインポート
import time

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

#【sort】を使って昇順にするのにかかる時間を求める
#処理の開始
startTime1=time.time()

#【昇順】にする処理
DROS.sort()

#処理の終了
endTime1=time.time()

#【sort】の処理時間
Time1=endTime1-startTime1

#処理時間の出力
print('【sort】を使ってリストを昇順にした時の処理時間')
print(Time1)



#【sorted】を使って昇順にするのにかかる時間を求める
#処理の開始
startTime2=time.time()

#【昇順】にする処理
newList=sorted(DROS)

#処理の終了
endTime2=time.time()

#【sorted】の処理時間
Time2=endTime2-startTime2

#処理時間の出力
print('【sorted】を使ってリストを昇順にした時の処理時間')
print(Time2)

#【sort】と【sorted】の処理時間でどちらの方が時間がかかるか比較する
#sortの方が早い場合
if Time1<Time2:
    print('【sort】の方が'+str(Time2-Time1)+'処理が早い\n')
#sortedの方が早い場合
else:
    print('【sorted】の方が'+str(Time1-Time2)+'処理が早い\n')


では、測定結果です。

これだけ見ると、sortの方が処理速度的にお得に思えます。
しかし、何回かやっていると時間が変わるので、その画面も表示します。

【sorted】の方が早いこともある。
こうなると、リストの並べ替えでsortedではなく、sortを使うメリットは処理速度以外に何かあるのか考えてみました。

リストをループで表示してみます。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

#ループでそのまま改行表示
print('リストをループで【そのまま】表示')
for music in DROS:
    print(music)

これを【sort】と【sorted】でループ表示してみます。

#[Alexandros]の時間と曲名のリスト
DROS=['4:27 RunAway','4:08 ワタリドリ','3:15 FamousDay','4:46 SNOWSOUND']

#ループでそのまま改行表示
print('リストをループで【そのまま】表示')
for music in DROS:
    print(music)

print()

#sortを使ってループで表示
print('リストをループで【sort】で表示')
DROS.sort()
for music in DROS:
    print(music)

print()

#sortedを使ってループで表示
print('リストをループで【sorted】で表示')
DROS=sorted(DROS)
for music in DROS:
    print(music)

なので、結局、リストの場合sortを使うメリットというものがこの記事の実験からは明確にはなりませんでした。

まとめるとsortとsortedの違いはsortはリストのみ、sortedはリストだけではなく辞書も使えます。
sortとsortedの処理時間を検証したところ、若干sortの方が私の環境では早いようです。

ドロスこと[Alexandros]の車のCMソング「風になって」が話題ですね。
私もこの曲大好きで、コロナが終息したらカラオケに行って歌いたいです。

当分は自粛、自粛、自粛ですが。

ベストアルバム『Where’s My History?』も発売されますね。
楽しみです。
iTunesで買おうかな(=^・^=)mm。。。

では、そのまま出力、ループで出力、時間の昇順に出力、時間の降順に出力でプログラミングして見ます。

最後までお読みいただき、ありがとうございます。

■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。

Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

サイトマップはこちらから

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

Pythonのリストで八王子占いと浦和占い

この記事を読むことで、

・Pythonのリストの基礎練習

・リストと乱数の組み合わせ

・IF文の復習

・改行の使い方

・数値と文字列を同時に表示

について占いゲーム感覚で学べます。

今回作るリストは、「八王子(東京の西の方)」と「浦和(埼玉県)」を例にして、
八王子占いと、浦和占いのリストです。

Pythonでリスト(配列)の添え字を乱数にして、「あなたは何八王子か」という
占い診断ゲームを作って行きます。

八王子には、

・西八王子駅
・北八王子駅
・京王八王子駅
・(ふつうの)八王子駅

があります。

以下、プログラムの手順です。

手順
1:乱数を使うためにランダムモジュールをインポートする
2:駅名のリストを用意する
3:リストの要素数(長さを調べる)
4:リストの添字の乱数を発生させて変数indexに代入する
5:結果を「あなたは【北八王子駅】です」などと言った形式で表示させる。

では、各手順ごとに見ていきます。

手順1:乱数を使うためにランダムモジュールをインポートする

import random

手順2:駅名のリストを用意する

station=['西','北','京王','(ふつうの)']

手順3:リストの要素数(長さを調べる)を変数numに格納

num=len(station)

このリストの場合は、要素数の長さが4になります。

手順5:リストの添字の乱数を発生させて変数indexに代入する

index=random.randrange(num)

ここで、randrangeを使うことで0からリストの長さ未満の乱数を発生させます。
この場合、リストの長さが4になりますので、0から3までの乱数が発生します。
リストのインデックスは0から始まりますので、最後の添字はリストの長さ-1になります。


手順5:結果を例えば、「あなたは【北八王子駅】です」と言った形式で表示させる。

print('あなたは【'+str(station[index])+'八王子駅】です。\n')

最後に改行して見やすくなるように、「\n」を入れています。
これは、「バックスラッシュエヌ」と読みます。
バックスラッシュの「\」は、Macでは「option」キーと「¥」を同時に押します。

ここまでのコードをまとめます。

import random

station=['西','北','京王','(ふつうの)']
num=len(station)
index=random.randrange(num)

print('あなたは【'+str(station[index])+'八王子駅】です。\n')

実行結果です。
このようにランダムに何八王子なのか出力されます。


このコードを少しアレンジして、次は埼玉県にある浦和駅占いを作ってみます。
浦和には、浦和駅の他に「浦和」が着く駅名は、

・北浦和駅
・東浦和駅
・西浦和駅
・南浦和駅
・武蔵浦和駅
・中浦和駅
・浦和美園駅

と、こんなにあるんですね。
埼玉あるあるですが、待ち合わせの時は、「何浦和駅なのか」確認が必要です。

そこで、上記の八王子のプログラムを少し変更して、浦和リストのコードを作成します。

変更したのは2点です。
まず、リストです。
長さが8のリストでstation[0],station[1]・・・,station[7]までになります。

station=['東','西','南','北','武蔵','美園','中','(ふつうの)']

先ほどの八王子の例と異なる点は、例えば北浦和、南浦和でしたら、浦和駅の前に「北」とか「南」が付きますが、「浦和美園駅」の場合は「美園」は浦和の後に付きます

その為、添字が5(くどいようですが、リストの添字は0から始まるので、リストの「6番目」である浦和美園駅は、添字は「5」になります。)の時を踏まえて下記の様にIFによる分岐する必要が生じます。

if index==5:#浦和美園駅の場合
  eki='【浦和'+station[index]+'駅】'
else:
  eki='【'+station[index]+'浦和駅】'

ここまでのコードをまとめます。

import random

station=['東','西','南','北','武蔵','美園','中','(ふつうの)']
num=len(station)
index=random.randrange(num)

if index==5:#浦和美園駅の場合
  eki='【浦和'+station[index]+'駅】'
else:
  eki='【'+station[index]+'浦和駅】'

print('あなたは'+eki+'です。\n')

実行結果です。

お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会2025です。

ご精読ありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

モバイルバージョンを終了