Python 列表中的否定和肯定

Python 列表中的否定和肯定,python,Python,我正在尝试编写一个函数,它允许我在列表中只添加正数,而在列表中只添加负数。我不知道从哪里开始我的编码虽然。任何帮助都很好,谢谢 例如: negpos([-5,5,6,-8,9]) 应返回: [-13, 20] 试试这个尺码: def negpos (lst): (neg, pos) = (0, 0) for elem in lst: if elem < 0: neg = neg + elem else:

我正在尝试编写一个函数,它允许我在列表中只添加正数,而在列表中只添加负数。我不知道从哪里开始我的编码虽然。任何帮助都很好,谢谢

例如:

negpos([-5,5,6,-8,9])
应返回:

[-13, 20]
试试这个尺码:

def negpos (lst):
    (neg, pos) = (0, 0)
    for elem in lst:
        if elem < 0:
            neg = neg + elem
        else:
            pos = pos + elem
    return [neg, pos]

print negpos ([-5,5,6,-8,9])

根据需要。

签出并删除。
filter
的第一个参数是一个函数,如果应该包含值,则返回True;如果不应该包含值,则返回False。第一次传递一个只选择小于0的整数的函数,第二次传递一个只选择大于0的整数的函数,然后将结果列表传递给
sum
。如果您需要帮助,只需添加一条注释,我会提供帮助,但我认为您将学到比我直接提供源代码更多的东西。

生成器表达式可以让生活变得简单高效:

def negpos( inlist ):
    p = sum(x for x in inlist if x > 0)
    n = sum(x for x in inlist if x < 0)
    return (n,p)
def negpos(inlist):
p=总和(如果x>0,则在列表中x代表x)
n=总和(如果x<0,则列表中的x代表x)
返回(n,p)

返回一个固定元组可能比返回一个列表更合适,我已经这样做了。

没有任何花哨的东西

>>> neg=0
>>> pos=0
>>> for i in [-5,5,6,-8,9]:
...   if i<0: neg+=i
...   if i>0: pos+=i
...
>>> print neg,pos
-13 20
>neg=0
>>>pos=0
>>>对于[-5,5,6,-8,9]中的i:
...   如果i0:pos+=i
...
>>>打印负数,pos
-13 20

求和
与过滤的生成器表达式一起使用是添加序列子集的最简单方法:

positive_tally = sum(x for x in seq if x > 0)
negative_tally = sum(x for x in seq if x < 0)
在我的系统中,专用的
for
循环的速度大约是原来的两倍(这并不特别奇怪,因为该循环使用基于生成器的方法执行了两次,但确认它仍然很有趣)。

导入工具
进口经营者
ltzero=functools.partial(operator.ge,0)#0>=num->num0
def negpos(lst):
返回[sum(filter(ltzero,lst)),sum(filter(gtzero,lst))]
negpos([-5,5,6,-8,9])#->[-13,20]

请不要将内置的
列表
用作变量名!谢谢,这真的帮助我理解了,因为它太简单了!:)@97834657647563(您不可能选择一个更简单的名称,是吗?):既然您现在已经将它标记为家庭作业,请确保不要逐字使用我的解决方案。好的教育者会检查像这样的网站,剽窃几乎肯定是一种失败的违法行为。我的建议是阅读和理解,然后走开,一天后自己实施。@paxdiablo哦,不,绝对不会。我们班有个孩子被发现使用stackoverflow。在我将问题发布到这里之前,我会先修改它们,然后使用docs.python.org进一步研究解决方案,然后编写自己的代码。这真的更有效吗?看来,对于循环,单次通过
可能仍然是最好的方法。我不知道效率如何,@D。我只知道,我倾向于避开许多人所说的Pythonic方法,尽管它更短,而且很可能更好。但那是因为我用它来教孩子们。我为圭多对我美丽的语言所做的一切而哀悼:-@D.肖利:“最好”是一个相对的术语。Pax的解决方案(+1)是单通的,效率更高,但Seth的解决方案是代码的一半,更具表现力。我认为在80%的时间里,我会选择更可读、更可维护的代码,而不是高效的代码。这完全取决于数量和频率。如果数组是数千个整数,则使用Pax,如果是几十个,则保持简短。它的效率可能稍低(
timeit
肯定会告诉我们),但结构更好,更容易适应不同的要求。@paxdiablo:我是Python n00b。你介意在<代码>上扩展或提供一个链接吗?我为Guido对我美丽的语言所做的事哀悼
请?这听起来像是家庭作业问题。。。如果这是一个家庭作业问题,请用
家庭作业
标记。过滤后的生成器表达式通常比使用
过滤
功能更清晰。
positive_tally = sum(x for x in seq if x > 0)
negative_tally = sum(x for x in seq if x < 0)
code1 = """
data = [-5,5,6,-8,9]
def negpos(seq):
  neg, pos = 0, 0
  for x in seq:
    if x >= 0:
      pos += x
    else:
      neg += x
  return neg, pos
"""
code2 = """
data = [-5,5,6,-8,9]
def negpos(seq):
  neg = sum(x for x in seq if x < 0)
  pos = sum(x for x in seq if x > 0)
  return neg, pos
"""
command = "negpos(data)"
timer1 = timeit.Timer(command, code1)
timer2 = timeit.Timer(command, code2)
timer1.repeat()
timer2.repeat()
import functools
import operator

ltzero = functools.partial(operator.ge, 0)  # 0>=num -> num<0
gtzero = functools.partial(operator.le, 0)  # 0<=num -> num>0

def negpos(lst):
    return [sum(filter(ltzero, lst)), sum(filter(gtzero, lst))]

negpos([-5,5,6,-8,9])  # ->  [-13, 20]