将事情分解成若干步骤是解决问题的好方法(以后总是可以重新组合步骤),而且有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)
现在,这是什么“字符串”的功能是什么样子?那么,每个成员是一对(el, mul)
。如果他们都是字符串,你可以添加它们。从以前的问题,mul
最终可能是在这一点上某种数量的,但是这是几乎一样简单:
def stringify(el, mul):
return str(mul) + el
把它放在一起,就大功告成了。如果你从来没有使用(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:]
,如前所述。)
一旦你得到了这个,如果你了解列表解析,你可能会意识到,这是一个熟悉的模式:从[]
开始,循环一些其他集合,并且每个值都满足一些测试。换句话说:
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)
而不是调用代码。
最后一件事:您似乎在每次调用时都会颠倒系数/乘数和物种/元素的顺序。例如:
def balance_equation(species,coeff):
data=zip(coeff,species)
除非有很好的理由不这样做,最好挑一个秩序和一致贯穿始终,或者你总是要运行到哪里,你让他们倒退的错误。
你的意思是'1H2O + 3O2 = 4CO2'? – irrelephant
是的,谢谢,我会修复现在写 – user1819717