我正在尝试编写一个函数,允许我只在列表中添加正数而在列表中只添加负数。我不知道从哪里开始编码。任何帮助都会非常感谢!
示例:
negpos([-5,5,6,-8,9])
应该返回:
[-13, 20]
答案 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)
结帐filter
和sum
。 filter
的第一个参数是一个函数,如果应该包含该值则返回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]