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

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

ただいまの
回答率

90.76%

  • Python

    6867questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 158

morutemu

score 33

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"が状況に合わせて入っています。

変数

def reminder(self, now, garbage):
    # リスト
    msg = ["今日は",\
           "明日は",\
           "の日です",\
           "燃やすごみ",\
           "燃やさないごみ",\
           "空き缶、スプレー缶、空きびん、廃蛍光管",\
           "プラスチック製容器梱包、ペットボトル",\
           "紙類ごみ",\
           "せんてい枝、庭の草",\
           "粗大ごみ",\
           "今日のごみの日はありません",\
           "明日のゴミの日はありません"
           ]

    gb_type = ["燃","不","缶","資","紙","草","粗","nan"]

    # 変数
    i = 8
    j = i - 1

    # メッセージ処理
    for k in range(i):
        if garbage == gb_type[j]:
            if now == "today":
                print(msg[k + 3])
                i+=1
                break
            else:
                print(msg[k + 4])
                i+=1
                break
        else:
            if now == "today":
                print(msg[k] + msg[k + 3] + msg[k + 2])
                i+=1
                break
            else:
                print(msg[k + 1] + msg[k + 3] + msg[k + 2])
                i+=1
                break

 追加

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

if now == "today":
    if garbage == "燃":
        print(msg[0] + msg[3] + msg[2])
    elif garbage == "不":
        print(msg[0] + msg[4] + msg[2])
    elif garbage == "缶":
        print(msg[0] + msg[5] + msg[2])
    elif garbage == "資":
        print(msg[0] + msg[6] + msg[2])
    elif garbage == "紙":
        print(msg[0] + msg[7] + msg[2])
    elif garbage == "草":
        print(msg[0] + msg[8] + msg[2])
    elif garbage == "粗":
        print(msg[0] + msg[9] + msg[2])
    else:
        print(msg[10])
elif now == "tommorow":
    if garbage == "燃":
        print(msg[1] + msg[3] + msg[2])
    elif garbage == "不":
        print(msg[1] + msg[4] + msg[2])
    elif garbage == "缶":
        print(msg[1] + msg[5] + msg[2])
    elif garbage == "資":
        print(msg[1] + msg[6] + msg[2])
    elif garbage == "紙":
        print(msg[1] + msg[7] + msg[2])
    elif garbage == "草":
        print(msg[1] + msg[8] + msg[2])
    elif garbage == "粗":
        print(msg[1] + msg[9] + msg[2])
    else:
        print(msg[11])

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# +++ モジュール +++
from threading import Thread
#import RPi.GPIO as GPIO
import datetime
import schedule
import pandas
import time
import csv
import os

# +++ 変数 +++
# リマインド時間
spc_time = "7:20"

# 確認時間
start_time = "00:00:00"
end_time = "08:10:00"

# +++ クラス +++
class GarbageDayReminder(object):
    # イニシャライズ
    def __init__(self):
        pass

    # 日付処理
    def date(self):
        # 変数
        FormatDay = "%Y/%m/%d "
        FormatTime = "%H:%M:%S"

        # 今日の日時を取得
        now = datetime.datetime.now()

        # 明日の日時を取得
        tmr = now + datetime.timedelta(days=1)

        # 1990-01-01対策の現在日付を追加
        date = now.strftime(FormatDay)

        # 今日、明日を振り分ける時間を作成
        start = datetime.datetime.strptime(date + start_time, FormatDay + FormatTime)
        end = datetime.datetime.strptime(date + end_time, FormatDay + FormatTime)

        # 今日、明日日付取得の分岐
        if start <= now <= end:
            # 今日日付の取得
            today = "{}/{}/{}".format(now.year, now.month, now.day)
            return today ,"today"
        else:    
            # 明日の日付を取得
            tommorow = "{}/{}/{}".format(tmr.year, tmr.month, tmr.day)
            return tommorow ,"tommorow"

    # csv処理
    def csv(self,date):
        # csvファイルを読み込む
        df = pandas.read_csv("./garbage_day.csv", encoding='cp932')

        # 何のゴミの日か取得
        garbage = df[df["日付"] == date]["ゴミ"].values[0]

        return garbage

    # リマインダー処理
    def reminder(self, now, garbage):
        msg = ["今日は",\
               "明日は",\
               "の日です",\
               "燃やすごみ",\
               "燃やさないごみ",\
               "空き缶、スプレー缶、空きびん、廃蛍光管",\
               "プラスチック製容器梱包、ペットボトル",\
               "紙類ごみ",\
               "せんてい枝、庭の草",\
               "粗大ごみ",\
               "今日のごみの日はありません",\
               "明日のゴミの日はありません"
               ]

        if now == "today":
            if garbage == "燃":
                print(msg[0] + msg[3] + msg[2])
            elif garbage == "不":
                print(msg[0] + msg[4] + msg[2])
            elif garbage == "缶":
                print(msg[0] + msg[5] + msg[2])
            elif garbage == "資":
                print(msg[0] + msg[6] + msg[2])
            elif garbage == "紙":
                print(msg[0] + msg[7] + msg[2])
            elif garbage == "草":
                print(msg[0] + msg[8] + msg[2])
            elif garbage == "粗":
                print(msg[0] + msg[9] + msg[2])
            else:
                print(msg[10])
        elif now == "tommorow":
            if garbage == "燃":
                print(msg[1] + msg[3] + msg[2])
            elif garbage == "不":
                print(msg[1] + msg[4] + msg[2])
            elif garbage == "缶":
                print(msg[1] + msg[5] + msg[2])
            elif garbage == "資":
                print(msg[1] + msg[6] + msg[2])
            elif garbage == "紙":
                print(msg[1] + msg[7] + msg[2])
            elif garbage == "草":
                print(msg[1] + msg[8] + msg[2])
            elif garbage == "粗":
                print(msg[1] + msg[9] + msg[2])
            else:
                print(msg[11])

    # 中間処理
    def intermediate(self):
        # 日付処理
        date, now = gdr.date()

        # csv処理
        garbage = gdr.csv(date)

        # リマインダー処理
        gdr.reminder(now, garbage)

    # 指定時間処理
    def specified_time(self):
        schedule.every().day.at(spc_time).do(gdr.intermediate)
        while True:
            schedule.run_pending()
            time.sleep(1)

    # チェック処理
    def button(self):
        pass
        #GPIO.setmode(GPIO.BCM)

        #GPIO12pinを入力モードとし、pull up設定とします 
        #GPIO.setup(12,GPIO.IN,pull_up_down=GPIO.PUD_UP)

        #while True:
        #    GPIO.wait_for_edge(12, GPIO.FALLING)
        #    sw_counter = 0

        #    while True:
        #        sw_status = GPIO.input(12)
        #        if sw_status == 0:
        #            sw_counter = sw_counter + 1
        #            if sw_counter >= 30:
        #                print("長押し検知!")
        #                gdr.intermediate()
        #                break
        #        else:
        #            print("短押し検知")
        #            break

        #        time.sleep(0.01)

        #    print(sw_counter)

    # メイン処理
    def main(self):
        # 指定時間処理(マルチスレッド)
        t = Thread(target=gdr.specified_time)
        t.start()

        # 実験用(上記プログラムで実行されるので、運用する際はgdr.intermediate()はなし)
        gdr.intermediate()

        # ボタン処理
        #gdr.button()

# +++ 初期動作 +++
if __name__ == "__main__":
    # GarbageDayReminderクラスをインスタンス化して実行
    gdr = GarbageDayReminder()
    gdr.main()

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KojiDoi

    2018/04/29 00:20

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

    キャンセル

  • morutemu

    2018/04/29 05:48

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

    キャンセル

  • morutemu

    2018/04/29 06:18

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

    キャンセル

回答 1

checkベストアンサー

+2

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

def gomi(now, garbage):
    gomi_dict = {"燃":"燃やすごみ",
                 "不":"燃やさないごみ",
                 "缶":"空き缶、スプレー缶、空きびん、廃蛍光管",
                 "資":"プラスチック製容器梱包、ペットボトル",
                 "紙":"紙類ごみ",
                 "草":"せんてい枝、庭の草", 
                 "粗":"粗大ごみ"}

    if now == "today":
        now = "今日"
    elif now == "tommorow":
        now = "明日"
    else:
        return

    if garbage in gomi_dict:
        print(now + "は" +gomi_dict[garbage] + "の日です")
    else:
        print(now + "のごみの日はありません")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 08:49

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

    キャンセル

  • 2018/04/29 09:18

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

    キャンセル

  • 2018/04/29 09:19

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    pythonのエラー

    testThreadが見つからないというメッセージが出てきたのですが、どこに問題があるのでしょうか? よろしくお願いします コード #-*- coding utf-8-*-

  • 受付中

    字下げについて

    お世話になります 本日マイナビ第26章を勉強しております http://news.mynavi.jp/series/python/026/ この中でどうしてもコマンドの字下げ

  • 解決済

    Python:2つのデータフレームを比較し,時間が近いものを抜き出す

    前提・実現したいこと いつもお世話になっております。データフレームの取扱が分からず、質問させていただきます。 次の2つのCSVファイルがあるとします。 (本当はソースコー

  • 解決済

    ファイルの中から特定の文字列の抽出

    ダンプデータの中から、”abcd"という文字を発見したら、”xyz”という文字を見つけるまで、そこの間の文字を抽出し、ファイルに出力したいのですが、どのようなソースコードを書けばよ

  • 解決済

    wxPythonにおいて、USBカメラの画像表示をしたい

    前提・実現したいこと ここ一週間くらい、teratailの皆様の力を借りながら、python上で動く動画や画像を表示できるGUIを作っています。画像は何とか表示でき、画像とパネル

  • 解決済

    Pythonのthreadingにおける、終了時の処理

    前提・実現したいこと Pythonを使って、動画や画像を表示するGUIを作っています。その中で、みなさまのご支援を頂ながらカメラの画像を取り込んで再生できるところまで来ました。

  • 解決済

    pythonでログの分析(時間)が出来ません。

    前提・実現したいこと pythonのプログラムで質問です。 以下のログがあります。 2012/01/02 13:00 0 2012/01/02 14:00 1 2012/01/

  • 解決済

    センサーで感知すると天気予報を喋るプログラムの作り方

    前提・実現したいこと Raspberry piにセンサーを接続させて、天気予報を喋らせるというプログラムを実行したいのですがエラーがでて実行できませんでした。  センサーを接続させ

同じタグがついた質問を見る

  • Python

    6867questions

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