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

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

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

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

Python

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

Q&A

解決済

2回答

9583閲覧

リスト要素を選択するプログラムの効率化

starrow1103

総合スコア137

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/03/24 06:39

編集2017/03/24 06:51

やりたいこと

  • リストがあるとします(例:selects = ["あ","か","さ"] )
  • コマンドライン上で、リストの要素を番号とともに順に表示して
  • 選択した番号と一致する要素を取得し、応じた何かを実行します

自分の記述方法で問題なく行えるのですが、もっと簡潔に書くことができるのではないかと思い、質問させていただきます。

現在行っているやりかた

python

1selects = ["あ","か","さ"] 2 3# 順に表示 4for i in range(len(selects)) : 5 print("%s:%s" % (i,selects[i])) 6 7"""実行結果 80:あ 91:か 102:さ 11""" 12 13# 番号の選択部分 14put = int(input("番号を選択:")) 15if put == 0: 16 print("a") 17if put == 1: 18 print("ka") 19if put == 2: 20 print("sa") 21print(select) 22 23""" 24番号を選択:1 25>> ka 26""" 27

このやり方だと、選択したい要素が多くなればなるほど場合分けが面倒になります。

また、要素の間に新しい要素を追加した時(例えば、"あ"と"か"の間に"い"を持ってきた場合)に、if文の分岐を書き直さなければならないため、ハゲてしまいます。

追記

また、実行したいものが特定のオリジナル関数であったりした場合、[("あ","a"),...]のようにセットで作ってしまうということも難しいかもしれません・・・

何か、いい方法はないでしょうか?

ご教授よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

実験してないので、動くかどうかわかりません。

Python

1selects = [["あ","a"],["か","ka"],["さ","sa"]] 2 3# 順に表示 4for i in range(len(selects)) : 5 print("%s:%s" % (i,selects[i][0])) 6 7"""実行結果 80:あ 91:か 102:さ 11""" 12 13# 番号の選択部分 14put = int(input("番号を選択:")) 15print(selects[put][1]) 16 17""" 18番号を選択:1 19>> ka 20"""

追記

オブジェクトの配列とメソッドオブジェクト

Python

1def a(): 2 print("hello") 3b = [ a, a, a ] 4b[0]()

実行結果

hello

投稿2017/03/24 06:48

編集2017/03/24 10:46
Zuishin

総合スコア28660

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

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

starrow1103

2017/03/24 06:50

回答ありがとうございます。 確かに、これでかなりスリムになりましたね! が、もし実行したいものが文字列のprint()ではない時、例えばclass内の関数であったりという時、うまくいかないような気がします^^; 後出しジャンケンですみません。追記しておきます。
Zuishin

2017/03/24 06:54

今のはリストのリストですが、代わりにオブジェクトのリストで対応できると思います。
starrow1103

2017/03/25 11:41

こんなことができるのですね! ご丁寧に、ありがとうございましたm(_ _)m 邁進します。
guest

0

すみません!自己解決しました。

exec()でできました。

python

1def a(): 2 print("a") 3selects = [("あ","a()")] 4for i in range(len(selects)) : 5 print("%s:%s" % (i,selects[i][0])) 6put = int(input("番号を選択:")) 7select = selects[put][1] 8exec(select)

投稿2017/03/24 06:55

starrow1103

総合スコア137

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

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

Zuishin

2017/03/24 06:59

どこが自己解決なのですか?
starrow1103

2017/03/24 07:03

申し訳ありませんm(_ _)m 普通に考えてZuishinさんにご教授いただいた内容でした。。。
starrow1103

2017/03/24 07:11

ベストアンサー修正しました^^; 失礼いたしました。
terapyon

2017/03/24 07:36

exec は使わないほうが良いですよ。 リストの内容を評価しますが、不正な処理が実行されることが懸念されます。
Zuishin

2017/03/24 08:36

ユーザーが入力したものではなくてハードコーディングされたものなので、この場合に限っては安全だと思いますが、考えなしに使うのは terapyon さんのおっしゃる通り避けた方がいいですね。 文字列ではなく、クラス a のオブジェクトを使えばいいだけなので、exec を使う意味もありません。
starrow1103

2017/03/24 10:26

今回のプログラムは他者の操作が介入するプログラムではないので、そうですね、 危険性をはらむことは理解しています。 クラスaのオブジェクトを使えばよいという部分が分からないのですが、どういうことでしょうか
Zuishin

2017/03/24 10:46

追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問