2016-09-22 91 views
0

一个相当简单的问题,但我仍在练习迭代多个变量与for循环。在下面,我试图返回一个新的列表,其中x是正数的个数,y是来自输入数组的负数的总和arr.正数//负数

如果输入数组为空或空,我将返回一个空阵列。

这是我得到的!

def count_positives_sum_negatives(arr): 
    return [] if not arr else [(count(x), sum(y)) for x, y in arr] 

目前正在接受......

类型错误: '诠释' 对象不是可迭代

+0

除了TypeError之外,我不知道在哪里插入x为正数且y为负数的条件。 –

+0

你能举一个arr的例子吗? –

+0

@picmate arr = [1,2,3,4,5,6,7,8,9,10,-11,-12,-13,-14,-15] –

回答

1

只需使用一个sum理解

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15] 
>>> sum(1 for x in arr if x > 0) 
10 
>>> sum(x for x in arr if x < 0) 
-65 
+0

但我如何返回一个新的列表与两个变量占? –

+0

好吧,只需将它们分配给局部变量c,然后返回[c,s] – wim

1

WIM的方法是很好的。 Numpy也适用于这些类型的东西。

import numpy as np 
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15]) 
print([arr[arr >= 0].size, arr[arr < 0].sum()]) 
>> [10, -65] 
1

你的错误是从该部分for x,y in arr这意味着arr预计将在2个元素(或任何类似容器)的元组的列表,例如像这样[(1,2), (5,7), (7,9)]但你拥有的是一个清单数字,不包含任何东西里面...的

现在,让你的愿望的结果,你可以使用WIM,这需要遍历列表的解决方案的两倍,或者你可以在一个去得到它与

>>> def fun(iterable): 
     if not iterable: 
      return [] 
     pos = 0 
     neg = 0 
     for n in iterable: 
      if n>=0: 
       pos = pos + 1 
      else: 
       neg = neg + n 
     return [pos, neg] 

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15] 
>>> fun(arr) 
[10, -65] 
>>> 
+0

我非常喜欢这个,谢谢你们俩!我为了适应其他输入测试所做的一个修改是将第7行更改为>,因为看起来这个问题将0视为非正面。 –