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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

2775閲覧

Python3  時差表示 ゼロ埋め 計算 繰り返し処理

python3_beginer

総合スコア46

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/04/27 13:45

編集2018/05/02 15:20

目標)

世界中で使えるTwitter のようなアプリをつくりたい。

投稿内容に投稿時刻を表示させたい。

ただ、世界中にいるユーザーがいるため、ユーザーの住んでいる場所によって表示される投稿時刻を修正したい。

例えば、東京(日本)に住んでいるユーザが現地時刻 19:38 に投稿した日記の時刻は、シンガポールに住んでいるユーザの画面では 21:38 と表示されなければなりません。
これは、日本の時刻がシンガポールの時刻よりもちょうど 2 時間進んでいるためです。なお、時間は 00:00 から 23:59 までの 24 時間制で表すものとします。

N 個の都市の時差を表す情報と、その中のある都市に住むユーザの日記の投稿時刻 (現地時間) が入力されるので
それぞれの都市に住むユーザの画面に表示される投稿時刻を出力するプログラムを作成して下さい。

入力される値
入力は以下のフォーマットで与えられます。

N
p_1 s_1
p_2 s_2

p_N s_N
q t

コード ''' 入力例2 27 howland -12 samoa -11 hawaii -10 alaska -9 california -8 arizona -7 texas -6 massachusetts -5 santiago -4 brasilia -3 greenland -2 verde -1 morocco 0 london 1 paris 2 athens 3 moscow 4 islamabad 5 astana 6 bangkok 7 hongkong 8 seoul 9 guam 10 kuril 11 southpole 12 nukualofa 13 tokelau 14 southpole 00:00 出力例2 00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00 00:00 01:00 02:00 ''' M = int(input()) data = [list(map(str, input().split())) for x in range(M)] #print(data) #型変換 data = [[x[0]] + [int(e) for e in x[1:]] for x in data] #print(data) c = list(map(str,input().split())) #print(c) place = c[0] hour, minute = list(map(int, c[1].split(':'))) #print(hour) #print(minute) #居住地の世界標準時差を調査 for x in range(M): if place == data[x][0]: place_diff = data[x][1] #print(place_diff) #投稿された国の時刻とユーザーの居住国の時差を計算 for x in range(M): diff = data[x][1] - (place_diff) # print(diff) if diff >= 0: ans_hour = hour + diff else: ans_hour = hour - abs(diff) ans_hour = '{0:02d}'.format(ans_hour) #print(ans_hour) #ゼロ埋めの時間表示 ans_hour = str(ans_hour) print(ans_hour + ':' + str(minute))

#質問

期待値を出力できましたが、皆様の率直な意見を頂戴したいです。
読みづらいや、わかりづらいなど、どんな意見でもいいので更なる成長のためにアドバイスいただきたいです。

#追記 

皆さま貴重なご意見ありがとうございます。
その中で、hayataka様からオリジナルコードが誤っているとご指摘を受けました。
そのため、皆さまのアドバイスを参照にコードを再編集致しました。

ただ、ジャッジ結果によると、9/10 とういパーフエクトなロジックにはなりませんでした。
現状、理由を解明することができず、解決方法に正しいコードを載せるまで至っておりません。

前回の内容で、誤った内容を展開してしまし申し訳ございません。
今後、内容を精査し解決方法を更新できるよう努力致します。
取り急ぎ失礼致します。

コード from collections import OrderedDict n = int(input()) timezone_table = OrderedDict() for _ in range(n): city, diff = input().split() timezone_table[city] = int(diff) base_city, base_time = input().split() base_hour, base_minute = map(int, base_time.split(':')) standard_hour = (base_hour - timezone_table[base_city]) % 24 for diff in timezone_table.values(): ans_hour = (standard_hour + diff) % 24 print("{0:02d}:{1}".format(ans_hour, base_minute))

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

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

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

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

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

guest

回答4

0

読みやすさの点で言えば、変数名が意味をなさない点がすごくコードを読み辛くしていると思います。名付けは、個人的には永遠のテーマですが、そこさえ適切に出来ていればすごく読みやすくなる重要な要素です。

その次に如何に処理するか、特に入力データの読み込みの部分を改善すれば良いと思います。試しに自分でもそこの処理を描いてみましたが、LouiS0616さんとほとんど同じ書き方になりました。

python

1from collections import OrderedDict 2 3 4tzdict = OrderedDict() 5for _ in range(int(input())): 6 city, timediff = input().split() 7 tzdict[city] = int(timediff) 8city, local_HHMM = input().split()

ちなみにですが、同じになったという点は誰が書いても一緒というPythonのいい点だと思います。

投稿2018/04/27 16:58

YouheiSakurai

総合スコア6142

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

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

python3_beginer

2018/04/28 13:48

ご指導ありがとうございます。 辞書の使い方勉強になりました! ありがとうございます。 私のミスでオリジナルコードのロジックに誤りがありました。 例題2でも正しく出力できるよう、コードを書きなおします。
guest

0

ベストアンサー

期待値を出力できたとのことなので、ロジックは正しいと信じてリファクタリングしました。

python

1data = [list(map(str, input().split())) for x in range(M)]

str.split()の返り値はstrのリストなので、型変換不要です。[input().split() for x in range(M)]だけで構いません。

python

1data = [[x[0]] + [int(e) for e in x[1:]] for x in data]

率直に言ってよくわかりません。xのlen()は2なので、data = [[x[0], int(x[1])] for x in data]で良いのでは。

上の二行はこうも書けます。

python

1[(lambda x:[x[0], int(x[1])])(input().split()) for x in range(M)]

次。

python

1c = list(map(str,input().split()))

これも型変換不要。

python

1hour, minute = list(map(int, c[1].split(':')))

このunpacking使うなら実はlistは省略できます(複数の左辺値に代入する場合)。map(int, c[1].split(':'))と書けたりする。

python

1for x in range(M): 2 if place == data[x][0]: 3 place_diff = data[x][1]

インデントが(泣) なにかと思ったら線形探索ですか。とりあえず、見つけたらbreakして良いのでは?

python

1for x in range(M): 2 if place == data[x][0]: 3 place_diff = data[x][1] 4 break

最初からOrderedDictに入れておくというのも考えましたが、さすがに面倒くさいので手を付けないでおきます。

次。

python

1for x in range(M): 2 diff = data[x][1] - (place_diff) # かっこ不要 3 if diff >= 0: # 正ならそのまま足す 4 ans_hour = hour + diff 5 else: # 負なら絶対値を引く 6 ans_hour = hour - abs(diff) 7 # よってこれはただのans_our = hour + diffだ 8 ans_hour = '{0:02d}'.format(ans_hour) 9 ans_hour = str(ans_hour) # 不要 10 print(ans_hour + ':' + str(minute)) # むしろここにformat入れてまとめたら? って言いたい。

これはこう。

python

1for x in range(M): 2 diff = data[x][1] - place_diff 3 ans_hour = hour + diff 4 print("{0:02d}:{1}".format(ans_hour, minute))

全体はこう。

python

1M = int(input()) 2 3data = [(lambda x:[x[0], int(x[1])])(input().split()) for x in range(M)] 4 5c = input().split() 6hour, minute = map(int, c[1].split(':')) 7 8place = c[0] 9for x in range(M): 10 if place == data[x][0]: 11 place_diff = data[x][1] 12 break 13 14for x in range(M): 15 diff = data[x][1] - place_diff 16 ans_hour = hour + diff 17 print("{0:02d}:{1}".format(ans_hour, minute))

ここまでやって走らせてみたら、例2の方で期待値が出ませんねぇ。自分のリファクタリングがミスったかのかと思ってオリジナルコード走らせたら、やっぱり期待値が出なかったです。

ans_hourがマイナスになってたので、負なら24足してあげる処理すると良いのでしょうか。ロジックちゃんと見てないので保証はしません。

投稿2018/04/27 14:39

編集2018/04/27 14:44
hayataka2049

総合スコア30933

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

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

python3_beginer

2018/04/28 13:46

ご指導ありがとうございます。 ひとつひとつ、丁寧に解説して頂き、とても勉強になりました。 ご指摘とおり、オリジナルコードのロジックに誤りがありました。 例題2でも正しく出力できるよう、コードを書きなおします。
guest

0

ちょっとだけスマートにできた...かも。あんまり変わってないようにも見えます。

Python

1from collections import OrderedDict 2 3n = int(input()) 4 5timezone_table = OrderedDict() 6for _ in range(n): 7 city, diff = input().split() 8 timezone_table[city] = int(diff) 9 10base_city, base_time = input().split() 11base_hour, base_minute = map(int, base_time.split(':')) 12 13standard_hour = (base_hour - timezone_table[base_city]) % 24 14for diff in timezone_table.values(): 15 print(f'{(standard_hour + diff) % 24:02d}:{base_minute:02d}')

Wandbox


datetimeモジュールを使ってみた例。どっちもどっちですね。

Python

1from collections import OrderedDict 2from datetime import datetime, timedelta 3 4n = int(input()) 5 6timezone_table = OrderedDict() 7for _ in range(n): 8 city, diff = input().split() 9 timezone_table[city] = timedelta(hours=int(diff)) 10 11base_city, base_time = input().split() 12base_time = datetime.strptime(base_time, '%H:%M') 13 14standard_time = (base_time - timezone_table[base_city]) 15for diff in timezone_table.values(): 16 print(datetime.strftime(standard_time + diff, '%H:%M'))

Wandbox

投稿2018/04/27 14:05

編集2018/04/27 17:37
LouiS0616

総合スコア35660

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

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

python3_beginer

2018/04/28 13:47

ご指導ありがとうございます。 辞書を使う方がスマートですね! 私のミスでオリジナルコードのロジックに誤りがありました。 例題2でも正しく出力できるよう、コードを書きなおします。
LouiS0616

2018/04/28 14:05

追記を見ましたが、上手くいかないのは分を出力する際に桁数を指定していないからでは?
python3_beginer

2018/04/28 14:20

ご指摘ありがとうございます。 めちゃくちゃ率直なコードですが、 print('{0:02d}'.format(ans_hour) + ':' + '{0:02d}'.format(base_minute)) 何とか自己解決できました。最初に不要な質問ばかりしてしまい、ご迷惑おかけして申し訳ありません。 LouiS0616さんを含め、皆さまのサポートがなければできませんでした。ありがとうございます。
guest

0

コード from collections import OrderedDict n = int(input()) timezone_table = OrderedDict() for _ in range(n): city, diff = input().split() timezone_table[city] = int(diff) base_city, base_time = input().split() base_hour, base_minute = map(int, base_time.split(':')) standard_hour = (base_hour - timezone_table[base_city]) % 24 for diff in timezone_table.values(): ans_hour = (standard_hour + diff) % 24 print('{0:02d}'.format(ans_hour) + ':' + '{0:02d}'.format(base_minute))

投稿2018/04/28 14:17

編集2018/04/29 03:47
python3_beginer

総合スコア46

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問