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))

我知道这不会打印任何东西。我拥有的是一个包含两个列表species=['H2O','O2','CO2']coeff=['1','3','-4']. 我需要它像这样打印: 1H20+3O2=4CO2

我首先将负系数和物种放在一个列表中,将正值放在另一个列表中。我似乎能够让这两个打印正确。

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))

编辑:我拿出了空格。 第二次编辑coeff是字符串列表。

您还应该测试是否pos为空,以便在适当的时候neg用 s 替换它们。0看起来系数是整数。

于 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

把它们放在一起,你就完成了。

使这一切变得更简单的一种方法:如果您从不将其(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)

除非有充分的理由不这样做,否则最好选择一个订单并始终保持一致,否则你总是会遇到一个让它们倒退的错误。

于 2012-12-19T00:54:55.637 回答