2012-12-19 57 views
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

我开始把负_系数和在一个目录品种和其他积极的一面。我似乎可以让这两个打印正确。

+0

你的意思是'1H2O + 3O2 = 4CO2'? – irrelephant

+0

是的,谢谢,我会修复现在写 – user1819717

回答

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是一个字符串列表。

您还应该测试posneg是否为空,以便在适当的情况下用0代替它们。看来这些系数是整数。

+1

是不是更好,编写'str(c)+ s为c,s在zip ...'而不是所有'x [0]'和'x [1]'?也不需要使用'str',因为你处理的内容必须是一个字符串(如果不是,那么'x [0] [1:]'将不起作用)。 – Stuart

+0

@Stuart Right;哎呀,当我想'coeff'包含'int'时,我就离开了它。我也会做其他的改变。谢谢。 – irrelephant

+0

@irrelephant:在上一个问题中,在另一个用户的建议下,他在来回传递'str'和'int'几次之间来回切换(实际上,我认为答案建议'float'而不是'int'出于某种原因...),所以以任何方式展示代码都不是太不合理...... – abarnert

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) 

现在,这是什么“字符串”的功能是什么样子?那么,每个成员是一对(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) 

除非有很好的理由不这样做,最好挑一个秩序和一致贯穿始终,或者你总是要运行到哪里,你让他们倒退的错误。