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

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

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

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

Q&A

解決済

7回答

4339閲覧

1~10の数字をローマ数字に変換

tamaria

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/07/04 02:46

編集2021/07/04 03:12

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ページで確認できます。

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

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

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

BeatStar

2021/07/04 02:55

コードは"<code>"または"<コード>"のボタンを押して出てくるやつの中に書きましょう。 そのままだとインデントが無視されるので意味が変わってきます。 Pythonはインデントがものを言う言語です。
meg_

2021/07/04 02:57

コードは「コードの挿入」で記入してください。
guest

回答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

can110

総合スコア38278

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

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

tamaria

2021/07/08 07:05

ありがとうございます。 頂いたソースをヒントに、辞書+printで最初からやり直してみます。
guest

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
TakaiY

総合スコア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
BeatStar

総合スコア4958

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

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

tamaria

2021/07/04 06:20

何だか深いお言葉ありがとうございます。
guest

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

ppaul

総合スコア24666

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

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

tamaria

2021/07/08 07:04

ありがとうございます! 参考にさせていただきます。
guest

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
rtgsdfsdg

総合スコア174

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

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

tamaria

2021/07/04 06:22

ありがとうございます。 SyntaxError: invalid syntaxというエラーが出てしまいますがヒントにして自力で頑張ってみます。
rtgsdfsdg

2021/07/04 10:20

おそらくPythonのバージョンがあっていません。最新バージョンにしてください。
tamaria

2021/07/08 06:59

お返事が遅くなり申し訳ありません。 バージョンアップで無事動きましたが、print関数を用いてより適切なものになるよう、いただいたソースをもとに仲間と勉強中です。 ありがとうございます!!
guest

0

こちらもお願いいたします。
https://teratail.com/questions/347228

投稿2021/07/06 01:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

K_3578

2021/07/06 01:55

注目の集まっている質問に自らの質問への回答を誘導するだけの行為であって回答で無いので 低評価しています。
退会済みユーザー

退会済みユーザー

2021/07/06 02:00

お願いします
BeatStar

2021/07/06 02:32

BAすら選ばないのに、『これもお願い』は不適切では?
Zuishin

2021/07/06 03:00

質問者とは別のアカウントですよ。 言語も聞いてることも違うので別人じゃないかと思います。 この質問が今の注目の質問第一位なので、100% 宣伝でしょうね。
BeatStar

2021/07/06 03:59

Zuishinさん あ…本当ですね…
Zuishin

2021/07/06 04:03

私も最初質問者かと思いました。 まさかこんな非常識なことをする人がいるとは思いませんよね。
BeatStar

2021/07/06 04:07

確かに… それで読み間違えましたね…
TakaiY

2021/07/06 05:09

回答ではないので、低評価です。
tamaria

2021/07/08 06:56

質問者本人です。 teratailで、初めての利用の為使い方がわからず申し訳ありません。 現在、同じゼミの仲間と皆様から頂いた情報をもとに頑張っております。 僕が目を離したすきに、こんなことになっているとは・・・ 申し訳ありませんでした!
K_3578

2021/07/08 07:00 編集

>質問者さん この人はただの荒らしユーザーなので質問者さんには非はありません。 下手に絡んだら粘着されるだけなので放置・スルーすることを強く推奨します。
tamaria

2021/07/08 07:02

>K_3578 ありがとうございます! スルーしてプログラムの勉強頑張ります!!!
退会済みユーザー

退会済みユーザー

2021/07/08 07:05

いえいえ、荒らしじゃありませんよ。 まあ質問者が謝罪するのに確かに違和感はありますね。
guest

0

たぶん、やりたいことはlis = list(input().split())ということですね。

投稿2021/07/04 02:58

itagagaki

総合スコア8402

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

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

tamaria

2021/07/04 06:19

ありがとうございます。 調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問