把事情分解成几个步骤是解决问题的好方法(你以后总是可以重新组合这些步骤),而且你已经完成了 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
把它们放在一起,你就完成了。
使这一切变得更简单的一种方法:如果您从不将其(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
答案。
显然 thestr
或 theint
是不必要的,但为了安全起见,我把它们都留在了;您应该查看周围的代码并删除不必要的代码。(如果你把它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
当然,现在您返回的是一个字符串而不是一对列表,因此您必须将调用代码更改为 justprint balance_equation(species, coeff)
而不是组合列表。
最后一件事:您似乎在每次调用时都颠倒了系数/乘数和物种/元素的顺序。例如:
def balance_equation(species,coeff):
data=zip(coeff,species)
除非有充分的理由不这样做,否则最好选择一个订单并始终保持一致,否则你总是会遇到一个让它们倒退的错误。