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

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

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

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1014閲覧

変数を要素に持つリストを文字列として出力したい! 文字列を計算式に代入したとき、計算式のまま出力したい!

tetonana

総合スコア1

Python 3.x

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/05/13 00:46

編集2020/05/13 21:11

前提・実現したいこと

1.変数a,b,c,d,eを用いた計算式を要素として格納したリストstuffに、 a,b,c,d,eをint型で宣言し、代入して計算結果を求めました。
2.このstuffを再利用してa,b,c,d,eをstr型で宣言しなおし、代入すると文字列が連結した状態で出るのですが、
これを代入だけして計算が行われないようにする方法はないでしょうか

3.また、上記ができない場合stuffの要素の計算式をそのまま文字列にして出力することは可能でしょうか
何も代入していない状態だとstuffに変数を計算式として格納した要素はNoneTypeになって
map関数で取得して文字列に変換しようとしたのですがエラーが出ます
変数を宣言すると式そのものではなく代入された結果が出力されます
変数の式を文字列そのものとして扱う方法はないでしょうか

発生している問題・エラーメッセージ

[a, b, a2+b, a+c, b2+c2, a+d, b4+e, d+e, a2+c2+e] にfoodsを代入したa,b,c,d,eを入れると
["卵","魚","卵卵魚","卵小麦","魚魚小麦小麦","卵肉","魚魚魚魚塩","肉塩"] と文字列が連結した状態で出ます
この代入を下記のように計算が行われずに計算式のままの状態で出力したいのですが、そのような方法は可能でしょうか
["卵","魚", "卵2+魚","卵+小麦","魚2+小麦2","卵+肉","魚4⁺塩","肉+塩"]

stuff = [a, b, a2+b, a+c, b2+c2, a+d, b4+e, d+e, a2+c2+e]を
下のようにしたい
stuff = ["a", "b", "a2+b", "a+c", "b2+c2", "a+d", "b4+e", "d+e", "a*2+c+2+e"]

該当のソースコード

Python3

1 2 3price = [30, 80, 50, 70, 20] 4a,b,c,d,e = price 5stuff = [a, b, a*2+b, a+c, b*2+c*2, a+d, b*4+e, d+e, a*2+c*2+e] 6print(stuff) 7#[30, 80, 140, 80, 260, 100, 380, 90, 180] 8 9foods = ["卵", "魚", "小麦", "肉", "塩"] 10a,b,c,d,e = foods 11stuff = [a, b, a*2+b, a+c, b*2+c*2, a+d, b*2+e, d+e, a*2+c*2+e] 12print(stuff) 13#["卵", "魚", "卵卵魚", "卵小麦", "魚魚小麦小麦", "卵肉", "魚魚魚魚塩", "肉塩", "卵卵小麦小麦塩"] 14

試したこと

a,b,c,d,eは宣言していない
stuff = [a, b, a2+b, a+c, b2+c2, a+d, b4+e, d+e, a2+c2+e]
new_stuff = list(map(str, stuff))
print(new_stuff)
NameError: name 'a' is not defined

補足情報(FW/ツールのバージョンなど)

Python3.8.1

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

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

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

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

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

meg_

2020/05/13 01:05

質問のコードを実行すると「NameError: name 'foods' is not defined」のエラーが出ます。
guest

回答4

0

ベストアンサー

2.このstuffを再利用してa,b,c,d,eをstr型で宣言しなおし、代入すると文字列が連結した状態で出るのですが、

これを代入だけして計算が行われないようにする方法はないでしょうか

代数計算ならsympyを使うという手もあります。

python3

1import sympy as sym 2(a,b,c,d,e) = sym.symbols('a b c d e') 3stuff = [a, b, a*2+b, a+c, b*2+c*2, a+d, b*2+e, d+e, a*2+c*2+e] 4print(stuff) 5# [a, b, 2*a + b, a + c, 2*b + 2*c, a + d, 2*b + e, d + e, 2*a + 2*c + e]

3.また、上記ができない場合stuffの要素の計算式をそのまま文字列にして出力することは可能でしょうか

泥臭くやるならf文字列にしてしまっても。

python3

1foods_name = ["卵", "魚", "小麦", "肉", "塩"] 2a,b,c,d,e = foods_name 3stuff = [a, b, f"{a}*2+{b}", f"{a}+{c}", f"{b}*2+{c}*2", f"{a}+{d}", f"{b}*2+{e}", f"{d}+{e}", f"{a}*2+{c}*2+{e}"] 4print(stuff) 5# ['卵', '魚', '卵*2+魚', '卵+小麦', '魚*2+小麦*2', '卵+肉', '魚*2+塩', '肉+塩', '卵*2+小麦*2+塩']

投稿2020/05/13 01:53

jeanbiego

総合スコア3966

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

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

tetonana

2020/05/13 21:10

まさに実現したい動きが実装できました sympyを使うこともf文字列を使えばできるということも初めて知りました 視野が広がりました、教えて頂きありがとうございます 貴重な回答ありがとうございました!
guest

0

@teamiklさんのコメントに従い修正版

Py3

1class F(str): 2 3 def __mul__(self, v): 4 return F("{}*{}".format(self, v)) 5 6 def __add__(self, v): 7 return F("{}+{}".format(self, v)) 8 9foods = [F(x) for x in ["卵", "魚", "小麦", "肉", "塩"]] 10a,b,c,d,e = foods 11stuff = [a, b, a*2+b, a+c, b*2+c*2, a+d, b*4+e, d+e, a*2+c*2+e] 12print(stuff) 13 14# ['卵', '魚', '卵*2+魚', '卵+小麦', '魚*2+小麦*2', '卵+肉', '魚*4+塩', '肉+塩', '卵*2+小麦*2+塩'] 15

バグあり版も残しておきます。頂いたコメントの意味が通じなくなってしまうので。

Py3

1class F(str): 2 3 def __mul__(self, v): 4 return "{}*{}".format(self, v) 5 6 def __add__(self, v): 7 return "{}+{}".format(self, v) 8 9 def __radd__(self, v): 10 return "{}+{}".format(v, self) 11 12 13foods = [F(x) for x in ["卵", "魚", "小麦", "肉", "塩"]] 14a,b,c,d,e = foods 15stuff = [a, b, a*2+b, a+c, b*2+c*2, a+d, b*4+e, d+e, a*2+c*2+e] 16print(stuff)

結果

Py3

1['卵', '魚', '卵*2+魚', '卵+小麦', '魚*2小麦*2', '卵+肉', '魚*4+塩', '肉+塩', '卵*2小麦*2+塩']

投稿2020/05/13 01:34

編集2020/05/13 02:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/05/13 01:57 編集

出来たと思ったらバグってました... orz. なぜA*2+B*2の時__add__が呼ばれないのだろう?
teamikl

2020/05/13 02:15

__mul__ 等の戻り値の型が str だからでは。 Fオブジェクトを返すようにすると期待通りの動作になりました。 (同じ場所ではまった
退会済みユーザー

退会済みユーザー

2020/05/13 02:21

なるほど!しばらく悩みそうでしたが早速のコメントありがとうございます。raddが必要になった時点でおかしいことに気づくべきでした。
teamikl

2020/05/13 02:37

質問で期待された動作かどうかは解りませんが、個人的には `a ++ b` や `2a * c` で正しくエラー報告される点が +1 Pythonの構文チェックで数式の検査ができるのが良いですね。
tetonana

2020/05/13 21:55 編集

stuffをformat()でstr型にして、リスト内包表記で取り出すのは全く思いつきませんでした 回答ありがとうございます!
退会済みユーザー

退会済みユーザー

2020/05/16 17:51 編集

そう言う動きではないです。文字列の演算子+とか*を上書きしています。普通だったら文字列同士の足算は連結された文字列を返しますが、それをあえてA+Bと言う文字列を返すようにしたと言うことです。掛け算も同様です。class Fを作ったのは、ビルトインクラスのstrの__add__と__mul__を直接上書きすることが出来ないからです。(それができたらほとんど全てのプログラムが動かなくなるでしょう)
tetonana

2020/05/16 17:12

文字列として扱えば置換できるけど +や*はpython標準のビルトインクラスstr内の__add__, __mul__で動きが決まっているので クラスを用いて同名メソッドでオーバーライドするということなんですね 理解できました!貴重な回答ありがとうございます!
guest

0

やるとしたらこんな感じですかね

python

1foods = {"a":"卵", "b":"魚", "c":"小麦", "d":"肉", "e":"塩"} 2stuff = ["a", "b", "a*2+b", "a+c", "b*2+c*2", "a+d", "b*4+e", "d+e", "a*2+c+2+e"] 3stuff_cnv = [] 4for item in stuff: 5 item = item.translate(str.maketrans(foods)) 6 stuff_cnv.append(item) 7print(stuff_cnv) 8# ['卵', '魚', '卵*2+魚', '卵+小麦', '魚*2+小麦*2', '卵+肉', '魚*4+塩', '肉+塩', '卵*2+小麦+2+塩']

投稿2020/05/13 01:36

x98000

総合スコア1096

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

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

tetonana

2020/05/13 21:20

replace()で地道にやろうかなと思っていたので translate() maketrans()を使った文字列置換はとても参考になりました 回答ありがとうございました!
guest

0

stuff = [a, b, a2+b, a+c, b2+c2, a+d, b4+e, d+e, a2+c2+e]を

下のようにしたい
stuff = ["a", "b", "a2+b", "a+c", "b2+c2", "a+d", "b4+e", "d+e", "a*2+c+2+e"]

実際にそのとおり配列を作って、あとは文字列置換で処理する、というような形で行うしかないと思います。

投稿2020/05/13 00:53

maisumakun

総合スコア146018

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

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

tetonana

2020/05/13 21:31

変数をリストに入れて使うその動きをきちんと想像できていなかったようです 今回の質問で文字列のリストの使い勝手の良さが分かりました 回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問