2

我正在尝试创建一个函数,该函数采用浮点列表并返回两个数字的列表,这等于所有正浮点和所有负浮点的总和。例如:

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

但我有点卡住了。谁能帮我更好地理解这一点?

4

3 回答 3

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)))
于 2013-02-23T02:46:36.507 回答
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))推导相同的语法,但一次只生成一个值,而不是一次创建整个列表。 [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

该解决方案利用了这样一个事实,即在 Python中, True == 1and是if和 it is else。False == 0sums[n > 0]sums[1]n > 0sums[0]

于 2013-02-23T04:31:36.637 回答
4

另一个解决方案:

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)
于 2013-02-23T02:56:58.393 回答