2

私がこれまでに持っているもの:

def balance_equation(species,coeff):
  data=zip(coeff,species)
  positive=[]
  negative=[]
  for (mul,el) in data:
    if int(mul)<0:
      negative.append((el,mul))
    if int(mul)>0:
      positive.append((el,mul))

私はこれが何も印刷しないことを知っています。私が持っているのは、2つのリストspecies=['H2O','O2','CO2']とを取り込む関数ですcoeff=['1','3','-4']。私はそれをそのように印刷する必要があります: 1H20+3O2=4CO2

まず、負の係数と種を1つのリストに入れ、正の係数をもう1つのリストに入れます。2つを正しく印刷できるように思えます。

4

2 に答える 2

7

これを試して:

species = ["H2O", "CO2", "O2"]
coeff = ['1', '-4', '3']

pos = [c + s for c, s in zip(coeff, species) if int(c) > 0]
neg = [c[1:] + s for c, s in zip(coeff, species) if int(c) < 0]
print ("+".join(pos))+"="+("+".join(neg))

編集:私はスペースを取り出しました。 2番目の編集coeff文字列のリストです。

posまた、必要に応じて、またはnegが空であるかどうかをテストして、それらを0sに置き換える必要があります。係数は整数のようです。

于 2012-12-19T00:44:55.160 に答える
4

物事をステップに分割することは、物事を解決するための良い方法であり(後でいつでもステップを再結合できます)、そこに80%の道があります。

あなたはすでにpositivenegativeリストを持っています。したがって、それぞれを文字列に変換する必要があります。

print poshalf, "=", neghalf

では、どのように変換positiveposhalfますか?これは、で区切られた各メンバーの表現であるため、各メンバーをその表現に変換できる'+'関数がある場合は、次のようになります。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は不要ですが、安全のために両方を残しておきました。周囲のコードを見て、不要なコードを削除する必要があります。(mulintとして使用している場合は、前述のように、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つの順序を選択して全体を通して一貫性を保つことをお勧めします。そうしないと、常にバグが発生し、逆方向になります。

于 2012-12-19T00:54:55.637 に答える