python初心者で課題でつまずいて困っております。
数字の1~10をローマ数字のⅠ~Ⅹに変換し該当の数字以外の時はエラーメッセージを表示するという内容で
ネット検索等を駆使して、自力で下記まで書きました。
Python
1lis = list(input()) 2dic = { 3 "1":"Ⅰ", 4 "2":"Ⅱ", 5 "3":"Ⅲ", 6 "4":"Ⅳ", 7 "5":"Ⅴ", 8 "6":"Ⅵ", 9 "7":"Ⅶ", 10 "8":"Ⅷ", 11 "9":"Ⅸ", 12 "10":"Ⅹ" 13} 14 15for moji in lis: 16 tr = dic.get(moji) 17 if tr is None: 18 tr = moji 19 print(moji, " -> ", tr)
これだと
①1~9まではうまくいくのですが、10を入力すると1と0に分解されて変換されてしまいます。
②11以上の入力で特定のエラーを出す
上記2点の問題を解決する事が出来ずお手上げ状態です。
誠に申し訳ありませんが、ご教授いただけるとありがたいです。
宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/04 02:57
回答7件
0
問題文をそのまま解釈すると、以下のような辞書を用いたコードでよさそうです。
Python
1dic = {str(i+1):c for i,c in enumerate('ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ')} 2for s in [' 1 ', '1a', '11', '1']: 3 print(s, dic.get(s, 'エラー')) 4""" 5[ 1 ] エラー 6[1a] エラー 7[11] エラー 8[1] Ⅰ 9"""
投稿2021/07/04 04:10
総合スコア38278
0
いろいろ回答付いてますが、ポイントはここでしょう。
入力として、 「10」 と入れたときに、これをどう解釈してほしいのでしょうか? 1と0ですか? 10ですか?
提示のソースコードは
python
1for moji in lis:
こうなっていますが、これは、入力をそのまま1文字ずつ=1桁ずつ見ていっていることになり、「10」は、かならず1と0と解釈されます。
「10」を1と0だとしてしまうことにすると、 10を表現することができなくなりますよね? また、「1」と「10」と「3」を連続で入れたいときにどうしましょう?
ここで、考えられるのは、数字と数字を空白などで区切って入力してもらうことです。「1 10 3」と入れてもらって、空白で区切って取り込むことができれば、紛らわしくなくなります。
あとは、空白で区切った入力をどのようにして取り込むのかということになりますが、そのあたりは、他の方の回答を参考にしてください。
投稿2021/07/04 06:50
編集2021/07/04 07:01総合スコア12830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
プログラミングは『こう書けばよい』ではないです。
『プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一支持されながら処理しているだけの代物である』です。
つまり現実世界でならどうするかを考えるだけです。
[追記1]
(上のものはケータイからだったので追記&修正)
解決済みになっていますが、一応書いておきます。
プログラミングは「こう書けばいい」ではないことは上で書いた通りです。
まずはプログラミングとかは置いといて『現実世界でなら』と考えてみてください。
言い換えると、
[依頼] ある人(Aさん)が数字(1~10) を言うので、それをローマ数字(Ⅰ~Ⅹ)にして書いてください。 ただし、その範囲(Ⅰ~Ⅹ)にない場合は『無いぞ?』と言ってください。
のような感じでしょうか。
そうすると、単純に考えると、
1 -> Ⅰ
2 -> Ⅱ
3 -> Ⅲ
...
9 -> Ⅸ
10 -> Ⅹ
というような表(じゃなくてもいいが)とかを用意して、
『参照しながら考える』ですね。
で、数字を読み取る時に たとえば 10 なら "1" と "0" と読みますか?
(二進数とかならともかく、今回は十進数としてですから)
普通に 10 ですよね。
で、変換前は数字で、変換後はどっちかっていうと文字ですよね。
(文章内にあったら)
ということは、{変換前,変換後} の組み合わせは**{数字,文字}**と読めますね。
※ ただし、プログラミングとかでの文字と文字列は別物なので区別しないといけない場合もあります。
(場合によっては使える・使えないが変わるので)
という事で、Pythhonでのdictionary のキーとかは **{数字,文字}**ですね。
{文字,文字} でもいいですが、これはちょっと工夫が必要なので。
②11以上の入力で特定のエラーを出す
に関しても上と同じです。
質問者さんはどのようにやりますか?
私なら、
1. まずAさんが言う数字を聞く 2. (1)で得た数字が( 0以下 or 11以上 ) かどうかを考える 2.1. 数字が条件(範囲外であること) に一致するなら『無いぞ?』と言う 2.2. 終了 3. 表をもとに考える 4. (3)でわかった文字を書く
のような感じになりますかね。
(場合によってはちょっと変わるが)
これを実装するだけです。
質問のコードを見ると、
{ (1), (3), (4) } はそれぞれ出来ています。(厳密にはできていないが一応修正したと仮定して)
後は(2)や(2.1)~(2.2) ですね。
これを実装すればいいだけです。
ただし、「数字以外(文字とか)を入力したら例外が飛んでくる」ので今回の仕様には合わないですね……
今、考えるとやっぱり数字よりも『文字列』がいいのかな?
その場合は、(1) と (2) の間で、『文字列を整数に変換する』系の処理が必要になります。
後は公式リファレンスやらなんやらで調べたりとかして実装すればいいだけです。
投稿2021/07/04 02:59
編集2021/07/08 08:00総合スコア4958
0
正規表現を使うとこういう感じです。
python
1import re 2 3dic = {1: 'Ⅰ', 2: 'Ⅱ', 3: 'Ⅲ', 4: 'Ⅳ', 5: 'Ⅴ', 6: 'Ⅵ', 7: 'Ⅶ', 8: 'Ⅷ', 9: 'Ⅸ', 10: 'Ⅹ'} 4 5def s2i(e): 6 try: 7 return int(e) 8 except: 9 return e 10 11def convert(s): 12 for moji in [s2i(e) for e in re.split(r'(\d+)', s) if e != '']: 13 if type(moji) != int: 14 tr = moji 15 elif moji in dic: 16 tr = dic.get(moji) 17 else: 18 tr = 'Error' 19 print(moji, " -> ", tr)
実行例
python
1>>> convert("1a10bc15d") 21 -> Ⅰ 3a -> a 410 -> Ⅹ 5bc -> bc 615 -> Error 7d -> d
投稿2021/07/04 03:50
総合スコア24666
0
ベストアンサー
python
1ROMAN_NUMERALS_DICT = { 2 "1":"Ⅰ", 3 "2":"Ⅱ", 4 "3":"Ⅲ", 5 "4":"Ⅳ", 6 "5":"Ⅴ", 7 "6":"Ⅵ", 8 "7":"Ⅶ", 9 "8":"Ⅷ", 10 "9":"Ⅸ", 11 "10":"Ⅹ" 12} 13 14srcs = input().split(" ") 15for num_str in srcs: 16 # 下の条件式の一部 := はセイウチ記号と呼ばれ、代入と同時にその値を示します。 17 if (roman_num := ROMAN_NUMERALS_DICT.get(num_str, None)) != None: 18 print(roman_num) 19 else: 20 # raise文で例外を発生。 21 raise ValueError(f"The value({num_str}) is invalid. Enter only 1 to 10.") 22 # しかし1~10以外の数字が入力されることは予期できるため、例外を使うのはやめましょう。 23 # 例外は予期できない結果のみに発生させるべきですから。 24 # よって本来ここでは print 関数を使いユーザーにその旨を伝えるのが適切です。
投稿2021/07/04 03:34
編集2021/07/04 03:36総合スコア174
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こちらもお願いいたします。
https://teratail.com/questions/347228
投稿2021/07/06 01:34
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/06 01:55
退会済みユーザー
2021/07/06 01:59
退会済みユーザー
2021/07/06 02:00
2021/07/06 02:32
2021/07/06 03:00
2021/07/06 03:59
2021/07/06 04:03
2021/07/06 04:07
2021/07/06 05:09
2021/07/08 06:56
2021/07/08 07:00 編集
2021/07/08 07:02
退会済みユーザー
2021/07/08 07:05
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。