2016-09-22 1 views
0

Un problème assez facile, mais je pratique toujours l'itération sur plusieurs variables avec des boucles for. Ci-dessous, je cherche à retourner une nouvelle liste, où x est le nombre de nombres positifs et y est la somme des nombres négatifs d'un tableau d'entrée arr.Nombre positif // Somme négative

Si le tableau d'entrée est vide ou nul, je dois retourner un tableau vide.

Voici ce que j'ai!

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

... Actuellement recevoir

TypeError: 'int' objet n'est pas itérables

+0

Outre l'erreur TypeError, je ne sais pas où insérer les conditions de x étant positif et y étant négatif. –

+0

Pourriez-vous donner un exemple de l'arr? –

+0

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

Répondre

1

utiliser simplement une compréhension 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

mais comment puis-je retourner une nouvelle liste avec les deux variables représentées? –

+0

Eh bien, il suffit de les affecter aux variables locales c, s puis retour [c, s] – wim

1

la manière de wim est bon. Numpy est bon pour ce genre de choses aussi.

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

l'erreur que vous obtenez est de cette partie for x,y in arr qui signifie que arr devrait être une liste de tuples de 2 éléments (ou tout autre récipient similaire), comme par exemple ce [(1,2), (5,7), (7,9)], mais ce que vous avez une liste des nombres, qui ne contiennent rien d'autre à l'intérieur ...

Maintenant pour obtenir votre résultat de désir, vous pouvez utiliser la solution de wim, qui ont besoin d'itérer deux fois sur la liste ou vous pouvez l'obtenir en une fois avec

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

J'aime beaucoup, merci à vous deux! La seule modification que j'ai faite pour accommoder d'autres tests d'entrée était de changer la ligne 7 en> car il semble que ce problème traite les 0 comme des non-positifs. –