J'essaie d'écrire une fonction qui imprime des fractions flottantes de% de nombres positifs, de nombres négatifs et de nombres qui = 0, en fonction des valeurs transmises par *args. J'ai pensé que la compréhension de la liste serait un moyen efficace d'obtenir ces valeurs, mais ce qui suit ne fonctionne pas. Je reçois un objet 'int' n'est pas un message d'erreur itérable. Des idées?

def plusMinus(*args):
    list_1 = []
    count = 0
    for i in args:
        list_1.append(i)
        count += 1
    pos = [i % sum(i) for i in list_1 if i > 0]
    neg = [i % sum(i) for i in list_1 if i < 0]
    zero = [i % sum(i) for i in list_1 if i == 0]
    num = count
    print(num)
    print(args)
    print(pos)
    print(neg)
    print(zero)

plusMinus(10, 25, 30, 0, -45, -50)
0
JD2775 23 mai 2018 à 18:23

3 réponses

Meilleure réponse

Cela pourrait être une approche:

def plusMinus(*args):

    num = len(args)
    pos = sum(1 for i in args if i > 0)
    neg = sum(1 for i in args if i < 0)
    # zero = sum(1 for i in args if i == 0)
    zero = num - pos - neg

    print('pos: {:1.1%}'.format(pos/num))
    print('neg: {:1.1%}'.format(neg/num))
    print('zero: {:1.1%}'.format(zero/num))

plusMinus(10, 25, 30, 0, -45, -50)

Qui génère:

pos: 50.0%
neg: 33.3%
zero: 16.7%

Notez que le formatage des chaînes peut générer des float s en pourcentage.

2
hiro protagonist 23 mai 2018 à 15:43

sum prend un itérable en entrée, donc dans votre compréhension de la liste, vous l'appliquez à un seul élément, devrait être fixé comme ceci par exemple:

[i % sum(list_1) for i in list_1 if i > 0]

MODIFIER

Je veux les% nombres pour chaque pos, neg et zero

Votre algorithme devrait être le suivant:

def plusMinus(*args):
    size = len(args)
    pos  = len([i for i in args if i > 0])/size
    neg  = len([i for i in args if i < 0])/size
    zero = len([i for i in args if i == 0])/size
    print(pos*100)
    print(neg*100)
    print(zero*100)
1
Netwave 23 mai 2018 à 15:32

Si vous souhaitez calculer un pourcentage en fonction des éléments

>>> pos = sum([1 for i in list_1 if i > 0]) / len(list_1) * 100
50.0
>>> neg = sum([1 for i in list_1 if i < 0]) / len(list_1) * 100
33.33333333333333
>>> zero = sum([1 for i in list_1 if i == 0]) / len(list_1) * 100
16.666666666666664
1
akash karothiya 23 mai 2018 à 15:36