質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1390閲覧

pythonのif文をfor文変更したい

morutemu

総合スコア45

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/04/28 12:15

編集2018/04/28 21:31

csvからゴミの日のイニシャル(1文字)を取得して、
riminder関数でメッセージをprintさせるようにしたいのですが、
for文がよくわからなくて、困っています。

csv

日付ゴミ
2018/4/1
2018/4/2
2018/4/3

csvからは以下のようにpandasで日付にあったゴミを取得してきており、
(garbage = df[df["日付"] == date]["ゴミ"].values[0])
何もないnull値のところもあります。

つまり、
garbageはcsvで取得したゴミの一文字もしくは
NULL(取得するとnanという文字が返ってくるようですが、、、)が入っています。
nowには"today"か"tommorow"が状況に合わせて入っています。

変数

python

1def reminder(self, now, garbage): 2 # リスト 3 msg = ["今日は",\ 4 "明日は",\ 5 "の日です",\ 6 "燃やすごみ",\ 7 "燃やさないごみ",\ 8 "空き缶、スプレー缶、空きびん、廃蛍光管",\ 9 "プラスチック製容器梱包、ペットボトル",\ 10 "紙類ごみ",\ 11 "せんてい枝、庭の草",\ 12 "粗大ごみ",\ 13 "今日のごみの日はありません",\ 14 "明日のゴミの日はありません" 15 ] 16 17 gb_type = ["燃","不","缶","資","紙","草","粗","nan"] 18 19 # 変数 20 i = 8 21 j = i - 1 22 23 # メッセージ処理 24 for k in range(i): 25 if garbage == gb_type[j]: 26 if now == "today": 27 print(msg[k + 3]) 28 i+=1 29 break 30 else: 31 print(msg[k + 4]) 32 i+=1 33 break 34 else: 35 if now == "today": 36 print(msg[k] + msg[k + 3] + msg[k + 2]) 37 i+=1 38 break 39 else: 40 print(msg[k + 1] + msg[k + 3] + msg[k + 2]) 41 i+=1 42 break 43

追加

上記質問で、わかりにくいとのことだったので質問内容を追加します。
もともと、上記プログラムのfor文でやりたかったことは、
以下プログラムになります。
簡単に言うとそれをぎゅっと縮めたくて、
for文を使ってみたのですが、それでうまくいかなくなりました。
じゃあ動いていた方使えばいいじゃないと感じるかもしれませんが、、
よろしくお願いします。

python

1if now == "today": 2 if garbage == "燃": 3 print(msg[0] + msg[3] + msg[2]) 4 elif garbage == "不": 5 print(msg[0] + msg[4] + msg[2]) 6 elif garbage == "缶": 7 print(msg[0] + msg[5] + msg[2]) 8 elif garbage == "資": 9 print(msg[0] + msg[6] + msg[2]) 10 elif garbage == "紙": 11 print(msg[0] + msg[7] + msg[2]) 12 elif garbage == "草": 13 print(msg[0] + msg[8] + msg[2]) 14 elif garbage == "粗": 15 print(msg[0] + msg[9] + msg[2]) 16 else: 17 print(msg[10]) 18elif now == "tommorow": 19 if garbage == "燃": 20 print(msg[1] + msg[3] + msg[2]) 21 elif garbage == "不": 22 print(msg[1] + msg[4] + msg[2]) 23 elif garbage == "缶": 24 print(msg[1] + msg[5] + msg[2]) 25 elif garbage == "資": 26 print(msg[1] + msg[6] + msg[2]) 27 elif garbage == "紙": 28 print(msg[1] + msg[7] + msg[2]) 29 elif garbage == "草": 30 print(msg[1] + msg[8] + msg[2]) 31 elif garbage == "粗": 32 print(msg[1] + msg[9] + msg[2]) 33 else: 34 print(msg[11])

もともとうまくいっていたプログラム全文↓

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4# +++ モジュール +++ 5from threading import Thread 6#import RPi.GPIO as GPIO 7import datetime 8import schedule 9import pandas 10import time 11import csv 12import os 13 14# +++ 変数 +++ 15# リマインド時間 16spc_time = "7:20" 17 18# 確認時間 19start_time = "00:00:00" 20end_time = "08:10:00" 21 22# +++ クラス +++ 23class GarbageDayReminder(object): 24 # イニシャライズ 25 def __init__(self): 26 pass 27 28 # 日付処理 29 def date(self): 30 # 変数 31 FormatDay = "%Y/%m/%d " 32 FormatTime = "%H:%M:%S" 33 34 # 今日の日時を取得 35 now = datetime.datetime.now() 36 37 # 明日の日時を取得 38 tmr = now + datetime.timedelta(days=1) 39 40 # 1990-01-01対策の現在日付を追加 41 date = now.strftime(FormatDay) 42 43 # 今日、明日を振り分ける時間を作成 44 start = datetime.datetime.strptime(date + start_time, FormatDay + FormatTime) 45 end = datetime.datetime.strptime(date + end_time, FormatDay + FormatTime) 46 47 # 今日、明日日付取得の分岐 48 if start <= now <= end: 49 # 今日日付の取得 50 today = "{}/{}/{}".format(now.year, now.month, now.day) 51 return today ,"today" 52 else: 53 # 明日の日付を取得 54 tommorow = "{}/{}/{}".format(tmr.year, tmr.month, tmr.day) 55 return tommorow ,"tommorow" 56 57 # csv処理 58 def csv(self,date): 59 # csvファイルを読み込む 60 df = pandas.read_csv("./garbage_day.csv", encoding='cp932') 61 62 # 何のゴミの日か取得 63 garbage = df[df["日付"] == date]["ゴミ"].values[0] 64 65 return garbage 66 67 # リマインダー処理 68 def reminder(self, now, garbage): 69 msg = ["今日は",\ 70 "明日は",\ 71 "の日です",\ 72 "燃やすごみ",\ 73 "燃やさないごみ",\ 74 "空き缶、スプレー缶、空きびん、廃蛍光管",\ 75 "プラスチック製容器梱包、ペットボトル",\ 76 "紙類ごみ",\ 77 "せんてい枝、庭の草",\ 78 "粗大ごみ",\ 79 "今日のごみの日はありません",\ 80 "明日のゴミの日はありません" 81 ] 82 83 if now == "today": 84 if garbage == "燃": 85 print(msg[0] + msg[3] + msg[2]) 86 elif garbage == "不": 87 print(msg[0] + msg[4] + msg[2]) 88 elif garbage == "缶": 89 print(msg[0] + msg[5] + msg[2]) 90 elif garbage == "資": 91 print(msg[0] + msg[6] + msg[2]) 92 elif garbage == "紙": 93 print(msg[0] + msg[7] + msg[2]) 94 elif garbage == "草": 95 print(msg[0] + msg[8] + msg[2]) 96 elif garbage == "粗": 97 print(msg[0] + msg[9] + msg[2]) 98 else: 99 print(msg[10]) 100 elif now == "tommorow": 101 if garbage == "燃": 102 print(msg[1] + msg[3] + msg[2]) 103 elif garbage == "不": 104 print(msg[1] + msg[4] + msg[2]) 105 elif garbage == "缶": 106 print(msg[1] + msg[5] + msg[2]) 107 elif garbage == "資": 108 print(msg[1] + msg[6] + msg[2]) 109 elif garbage == "紙": 110 print(msg[1] + msg[7] + msg[2]) 111 elif garbage == "草": 112 print(msg[1] + msg[8] + msg[2]) 113 elif garbage == "粗": 114 print(msg[1] + msg[9] + msg[2]) 115 else: 116 print(msg[11]) 117 118 # 中間処理 119 def intermediate(self): 120 # 日付処理 121 date, now = gdr.date() 122 123 # csv処理 124 garbage = gdr.csv(date) 125 126 # リマインダー処理 127 gdr.reminder(now, garbage) 128 129 # 指定時間処理 130 def specified_time(self): 131 schedule.every().day.at(spc_time).do(gdr.intermediate) 132 while True: 133 schedule.run_pending() 134 time.sleep(1) 135 136 # チェック処理 137 def button(self): 138 pass 139 #GPIO.setmode(GPIO.BCM) 140 141 #GPIO12pinを入力モードとし、pull up設定とします 142 #GPIO.setup(12,GPIO.IN,pull_up_down=GPIO.PUD_UP) 143 144 #while True: 145 # GPIO.wait_for_edge(12, GPIO.FALLING) 146 # sw_counter = 0 147 148 # while True: 149 # sw_status = GPIO.input(12) 150 # if sw_status == 0: 151 # sw_counter = sw_counter + 1 152 # if sw_counter >= 30: 153 # print("長押し検知!") 154 # gdr.intermediate() 155 # break 156 # else: 157 # print("短押し検知") 158 # break 159 160 # time.sleep(0.01) 161 162 # print(sw_counter) 163 164 # メイン処理 165 def main(self): 166 # 指定時間処理(マルチスレッド) 167 t = Thread(target=gdr.specified_time) 168 t.start() 169 170 # 実験用(上記プログラムで実行されるので、運用する際はgdr.intermediate()はなし) 171 gdr.intermediate() 172 173 # ボタン処理 174 #gdr.button() 175 176# +++ 初期動作 +++ 177if __name__ == "__main__": 178 # GarbageDayReminderクラスをインスタンス化して実行 179 gdr = GarbageDayReminder() 180 gdr.main() 181

これでわかりますでしょうか??
わからない場合は、どんどん質問おねがいします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2018/04/28 15:20

それで、質問は何ですか。ただ分かりませんでは答えようがありませんよ。
morutemu

2018/04/28 20:48

申し訳ない。ですよね。これだけでは意味が分かりませんよね。えーっとですね。これで出力すると、全て燃やすごみの日になってしまっているんですよね。それを解決したくちょっと質問しました。質問内容もちょっと編集します。
morutemu

2018/04/28 21:18

追加してみました!確認お願いします!
guest

回答1

0

ベストアンサー

リファクタリングしてみました。私のコードが最良であると主張するつもりはありません。動作の正しさも保証しません。

python

1def gomi(now, garbage): 2 gomi_dict = {"燃":"燃やすごみ", 3 "不":"燃やさないごみ", 4 "缶":"空き缶、スプレー缶、空きびん、廃蛍光管", 5 "資":"プラスチック製容器梱包、ペットボトル", 6 "紙":"紙類ごみ", 7 "草":"せんてい枝、庭の草", 8 "粗":"粗大ごみ"} 9 10 if now == "today": 11 now = "今日" 12 elif now == "tommorow": 13 now = "明日" 14 else: 15 return 16 17 if garbage in gomi_dict: 18 print(now + "は" +gomi_dict[garbage] + "の日です") 19 else: 20 print(now + "のごみの日はありません")

投稿2018/04/28 23:43

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morutemu

2018/04/28 23:49

非常に美しいプログラムですねぇ。さすがです。 for文よりも圧倒的に見やすく、わかりやすいです。 感心しました。ありがとうございました。 ちょっと入れてみます!!
morutemu

2018/04/29 00:18

さすがです!うまくいきました! ありがとうございました!
morutemu

2018/04/29 00:19

さすがです! プログラムも読みやすく、完璧に動作しました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問