列表中的否定和肯定

时间:2011-02-21 02:04:48

标签: python

我正在尝试编写一个函数,允许我只在列表中添加正数而在列表中只添加负数。我不知道从哪里开始编码。任何帮助都会非常感谢!

示例:

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

应该返回:

[-13, 20]

6 个答案:

答案 0 :(得分:7)

尝试使用此尺寸:

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

它只维护两个累加器并添加到相关的累加器中。输出是:

[-13, 20]

根据需要。

答案 1 :(得分:2)

结帐filtersumfilter的第一个参数是一个函数,如果应该包含该值则返回True,如果不包含则返回False。第一次只选择小于0的整数,第二次传递只选择大于0的整数的函数,然后将结果列表传递给sum。如果你需要帮助,只需添加评论我会帮忙,但我认为你会学到更多,而不仅仅是我给你直接的源代码。

答案 2 :(得分:1)

生成器表达式可以简化生活:

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)

返回固定元组而不是列表可能更合适。我已经完成了。

答案 3 :(得分:0)

没有任何花哨的东西

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

答案 4 :(得分:0)

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

positive_tally = sum(x for x in seq if x > 0)
negative_tally = sum(x for x in seq if x < 0)

将这些功能合并到一个negpos功能中很容易,但除非你在几个不同的地方这样做,否则可能是不必要的。

出于好奇,我决定在生成器表达式方法和简单for循环之间进行实际的时序比较:

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

在我的系统上,专用的for循环大约快两倍(这并不特别令人惊讶,因为循环使用基于生成器的方法执行两次,但确认它仍然很有趣)

答案 5 :(得分:0)

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]