我正在尝试创建一个函数,它接受一个浮点列表并返回两个数字的列表,它等于所有正浮点数和所有负浮点数的总和。例如:
statement([30.95, -15.67, 45.56, -55.00, 43.78])
returns [-70.67, 120.29]
这是迄今为止能够做到的事情:
res= []
for i in range(len(l)-1):
for j in range(i,len(l)):
if l[i]>=l[i+1]:
res =
return res
但我有点卡住了。谁能帮助我更好地理解这一点?
答案 0 :(得分:5)
我会将它们过滤成两个列表:
positives = [n for n in numbers if n < 0]
negatives = [n for n in numbers if n > 0]
然后使用sum()
:
return sum(negatives), sum(positives)
或者如果你想让你的导师发疯:
statement = lambda n: map(sum, zip(*map(lambda x: (x, 0)[::cmp(0, x)], n)))
答案 1 :(得分:5)
def sum_negpos(numbers):
return [sum(n for n in numbers if n < 0), # sum of negative numbers
sum(n for n in numbers if n > 0)] # sum of positive numbers
该解决方案使用生成器表达式(x for x in it if cond(x))
,它使用与list comprehensions [x for x in it if cond(x)]
相同的语法,但一次只能输入一个值,而不是一次创建整个列表。
一次通过:
def sum_negpos(numbers):
sums = [0, 0] # negative, positive sum
for n in numbers:
sums[n > 0] += n
return sums
此解决方案利用了这样一个事实,即True == 1
和False == 0
因此sums[n > 0]
sums[1]
n > 0
sums[0]
,而{{1}}则为{{1}}。
答案 2 :(得分:3)
又一个解决方案:
def statement(l):
return reduce(lambda (n, p), x: (x < 0) and (n + x, p) \
or (n, p + x), l, (0, 0))
statement([30.95, -15.67, 45.56, -55.00, 43.78])
(-70.67, 120.29)