物事をステップに分割することは、物事を解決するための良い方法であり(後でいつでもステップを再結合できます)、そこに80%の道があります。
あなたはすでにpositive
とnegative
リストを持っています。したがって、それぞれを文字列に変換する必要があります。
print poshalf, "=", neghalf
では、どのように変換positive
しposhalf
ますか?これは、で区切られた各メンバーの表現であるため、各メンバーをその表現に変換できる'+'
関数がある場合は、次のようになります。stringify
poshalf = '+'.join(stringify(el, mul) for (el, mul) in pos)
neghalf = '+'.join(stringify(el, mul)[1:] for (el, mul) in neg)
看板[1:]
を出すことがあります。-
が実際には文字列ではなく整数である場合mul
、値を渡す前に値を否定することはおそらく理にかなっていますstringify
。
neghalf = '+'.join(stringify(el, -mul) for (el, mul) in neg)
では、その「stringify」関数はどのように見えるのでしょうか。さて、それぞれのメンバーは(el, mul)
ペアです。両方が文字列の場合は、追加するだけです。以前の質問から、mul
この時点である種の数字になる可能性がありますが、それはほぼ同じくらい簡単です。
def stringify(el, mul):
return str(mul) + el
すべてをまとめれば、完了です。
これをすべて簡単にする1つの方法:(el, mul)
を呼び出す以外の目的でを使用しない場合は、最初stringify
に呼び出しstringify
て結果を保存するだけです。
def balance_equation(species,coeff):
data=zip(coeff,species)
positive=[]
negative=[]
for (mul,el) in data:
if int(mul)<0:
negative.append(str(mul)[1:] + el)
if int(mul)>0:
positive.append(str(mul) + el)
return positive, negative
前の質問とこの質問の両方のバージョンを省略した最後の行を覚えておいてください。値を返さない場合は、値を把握するためのすべての労力が無駄になり、発信者None
は応答として取得します。
明らかに、str
またはのどちらかint
は不要ですが、安全のために両方を残しておきました。周囲のコードを見て、不要なコードを削除する必要があります。(mul
intとして使用している場合は、前述のように、str(-mul)
の代わりに使用することをお勧めしますstr(mul)[1:]
。)
これを取得したら、リスト内包表記を理解すると、これがおなじみのパターンであることに気付くかもしれません。最初は[]
、他のコレクションをループし、append
各値はいくつかのテストに適合します。言い換えると:
def balance_equation(species,coeff):
data=zip(coeff,species)
positive = [str(mul) + el for (mul, el) in data if int(mul) > 0]
negative = [str(mul) + el for (mul, el) in data if int(mul) < 0]
return positive, negative
これをさらに単純化できることに気付くかもしれません。リストを使用するのは文字列を作成することだけなので、文字列方程式を返す関数が必要な場合があります(この場合、リスト内包表記—まだそれらについて知らない場合は、その部分を無視してください)。
def balance_equation(species,coeff):
data=zip(coeff,species)
positive = '+'.join(str(mul) + el for (mul, el) in data if int(mul) > 0)
negative = '-'.join(str(mul) + el for (mul, el) in data if int(mul) < 0)
return positive + '=' + negative
もちろん、リストのペアではなく文字列を返すようになったためprint balance_equation(species, coeff)
、リストを組み合わせる代わりに、呼び出し元のコードを変更する必要があります。
最後にもう1つ、呼び出しごとに係数/乗数と種/要素の順序を逆にしているようです。例えば:
def balance_equation(species,coeff):
data=zip(coeff,species)
他の方法で行う正当な理由がない限り、1つの順序を選択して全体を通して一貫性を保つことをお勧めします。そうしないと、常にバグが発生し、逆方向になります。