特に参考になった箇所について、下記に残します。 ーーー Input関数で取った値(str)をint型に変換している所が、参考になりました。 imp_ymd_int = [int(i) for i in imp_ymd] リストの中でfor文が使用可能とは・・吃驚しました。(゜゜)
y = input("誕生日(西暦)を入力してください。\n")
m = input("誕生日(月)を入力してください。1月なら、1と入力。\n")
d = input("誕生日(日)を入力してください。\n")
imp_ymd = [y, m, d]
imp_ymd_int = [int(i) for i in imp_ymd]
yyyymmdd = dt.date(imp_ymd[0], imp_ymd[1], imp_ymd[2])
あとは、この辺りが参考になりました。m(_ _)m
star_li_fm = [
dt.date(imp_ymd_int[0], 3, 21),
dt.date(imp_ymd_int[0], 4, 20),
・
・
]
・
・
for i, star_li_result in enumerate(star_li_result):
if star_li_fm[i] <= yyyymmdd < star_li_fm[i + 1]:
print(star_li_result)
break
# 文字列から日付
import datetime as dt
tstr = ['2022-12-29',
'2022-3-18',
'2022-5-16']
# tdatetime = [dt.datetime.strptime(i, '%Y-%m-%d') for i in tstr]
# print(tdatetime)
# tdate = [dt.date(i.year, i.month, i.day) for i in tdatetime]
# print(tdate)
# これを1行にまとめる
tdate = [dt.date(i.year, i.month, i.day) for i in [dt.datetime.strptime(i, '%Y-%m-%d') for i in tstr]]
print(tdate)
# 日付から文字列
tstr = [i.strftime('%Y/%m/%d') for i in tdate]
print(tstr)
def get_horoscope_name(dt):
month = dt.month
day = dt.day
for k, v in base_dic.items():
if v['month'] > month:
return k
elif v['month'] == month:
if v['day'] >= day:
return k
return list(base_dic.keys())[0]
def get_horoscope_name(dt, default="やぎ座"):
month = dt.month
day = dt.day
for k, v in base_dic.items():
if v['month'] > month:
return k
elif v['month'] == month:
if v['day'] >= day:
return k
return default
たかちゃんさんの投稿
(投稿ID: 5333)
pythonのバージョンが3.9.13ですので、他の方と書き方が違うのかもしれませんが・・。
参考サイト:
https://docs.python.org/ja/3.9/library/datetime.html
たかちゃんさんのコメント
(コメントID: 7590)
# 文字列から数字に変更しています。
user_y = int(y_num)
user_m = int(m_num)
user_d = int(d_num)
keiko ishさんのコメント
(コメントID: 7597)
投稿ありがとうございます。
私なら、下記のように書きます。
keiko ishさんのコメント
(コメントID: 7598)
keiko ishさんのコメント
(コメントID: 7599)
入力した日付を条件分岐して星座を出力するには
・enumerateでindex番号と要素(星座)を同時に数え上げる
・index番号で条件分岐して要素(星座)を出力する
この2点に着目する必要があります。
・for 文で要素を数え上げる
・if文でindex 番号で条件分岐してenumerateしたものを出力
・出力したらbreakで抜ける
という流れを上記のコードで行なっております。
たかちゃんさんのコメント
(コメントID: 7601)
ありがとうございます!
解説までありがとうございます。
お陰様で理解できました。m(_ _)m
特に参考になった箇所について、下記に残します。
ーーー
Input関数で取った値(str)をint型に変換している所が、参考になりました。
imp_ymd_int = [int(i) for i in imp_ymd]
リストの中でfor文が使用可能とは・・吃驚しました。(゜゜)
あとは、この辺りが参考になりました。m(_ _)m
ーーー
keiko ishさんのコメント
(コメントID: 7603)
コードを拝見して、一生懸命作ったのが伝わってきたので
もっと楽できたら良いなと思い、投稿しました😄
リストに格納後、int変換を1行で書く方が楽ですし、
listのindex番号でfor文作った方が楽できます😄
keiko ishさんのコメント
(コメントID: 7604)
日付から文字列に変換するリスト内包表記
たかちゃんさんのコメント
(コメントID: 7606)
星座ごとの日付が多すぎて、「良い方法ないかな?」と思っていました。(^^;
小川 慶一さんのコメント
(コメントID: 7613)
あとで、def で定義する関数を学びます。
関数を使って書くと以下のような感じになります。
ゆみこさんのコメント
(コメントID: 8159)
こちらのコード、とても参考になりました。
(この辞書だけ他で見たときは、この辞書からどうやって星座に変換するのかを自分で考える余裕がありませんでした)
1点質問です。
このコードですと、例えば12月31日生まれの人は結果が「None」になってしまうのではないかと思います。
そのため、私は関数の最後に1行追加してみました。
小川先生でしたら、ここはどのようにされますでしょうか?
些細な質問で申し訳ありませんが、よろしくお願いいたします。
小川 慶一さんのコメント
(コメントID: 8160)
失礼しました。
以下は洗練された良い書き方だと思います。
ほかの解決策のひとつとしては...見つからないの初期値を指定してしまうとか。
あるいはもう、各星座の期間の両端の情報を持つ辞書を作ってしまうか。
ほかにも考え方はありそうですね。
小川 慶一さんのコメント
(コメントID: 8161)
ゆみこさんのコメント
(コメントID: 8162)
ご返信ありがとうございます。
・「初期値を指定」できることを知らなかったので、勉強になりました。
(また、関数定義で"やぎ座"と書くことに抵抗があったのですが、初期値指定のところに書くならかなり抵抗が少ないです)
・最初の辞書は、期間の両端の情報を持たない点がとてもいいと思っていました。
ですが、両端を持つときの辞書やコードの書き方が、とても勉強になりました。
また、このように別パターンのコードがすぐに書けるということはとても大切だと改めて思いました。
>ほかにも考え方はありそうですね。
他のやり方はまだ考えられていませんが、これに限らず、自分で考える時間を作るようしたいと思います。
・このような些細な質問に、ここまで手をかけてくださることにも、改めて心を動かされました。
「人は教えることによって、もっともよく学ぶ」という言葉も思い出しました。
1点確認です。
以下の部分の記述はなくても同じではないかと思いましたが、いかがでしょうか。
【確認に使用した関数】
【確認に使用したコード】
ご確認のほど、よろしくお願いいたします。
ゆみこさんのコメント
(コメントID: 8163)
新たなコメントに気づかず投稿してしまいました。
2023/05/22 13:32にいただいた「コメントID: 8161」は、また改めてゆっくり確認させていただきます。
小川 慶一さんのコメント
(コメントID: 8165)
> 以下の部分の記述はなくても同じではないかと思いましたが、いかがでしょうか。
確かに不要ですね。
ChatGPT で得られたコードをあまり気にせず使っていました。申し訳ないです。
ゆみこさんのコメント
(コメントID: 8171)
「コメントID: 8161」「コメントID: 8165」のコメント、ありがとうございました。
「コメントID: 8161」のコード、以下の部分を削除して確認しました。
関数自体は増えますが、両端を持つよりもこちらの方がスマートで個人的に好きです。
あと、関数「get_first_month_day_of_zodiac_sign」は、シンプルですが星座のルールに則ると確かにこうなるなと思いました。
こうして複数のパターンのコードを見ているうちに、「スマートではないけれど、もしかしたらこういうやり方でもできるかも」という別の案も浮かびました。
(小川先生にいろいろなパターンを提示していただいたおかげです)
星座に関するプログラムを通して、Pythonに取り組む上での感覚が少しできてきたような気がします。
どうもありがとうございました。
小川 慶一さんのコメント
(コメントID: 8175)
あとは、元データは本来CSVファイルのようなものであるべきかと。
自分でCSVファイルを作ってそれを読み込むようにプログラムを改変してみてください。CSVファイルの扱いは、 section 2 で学びます。
ゆみこさんのコメント
(コメントID: 8176)
なるほど、星座のような「基本的に固定」のものでも、そうした方がいいのですね。
ファイルの読み書きは、確かにPythonを使っていると必要になることが多いです。
ですが、自分でコードを書く頻度が少なかったので、都度調べたりコピペしたりしていました。
近々改変してみます。
小川 慶一さんのコメント
(コメントID: 8177)
DPRで言えばDとPの分離です。
また、分離できれば、データの編集はエンジニアの仕事ではなくなります。データの編集とRを出力するプログラムの編集の担当者を分離できますね。
ゆみこさんのコメント
(コメントID: 8178)
今回の例である「星座」で考えてしまっていたため、「埋め込んでもいいのでは」「(エンジニア側である)自分で書いてもいいのでは」と思っていたのだと気づきました。
仕事で「受領したデータと既に用意されているデータを加工して、依頼者の要望に沿うようなデータを頑張って作る」というような作業は、DとPが分離されていたなと思いました。
「DとPの分離」「DとPの担当者の分離」という点、理解できたと思います。