Python 为什么我的if语句得不到正确的答案?还有,如何找到所有输入的平均值?

Python 为什么我的if语句得不到正确的答案?还有,如何找到所有输入的平均值?,python,printing,average,Python,Printing,Average,由于某些原因,我在运行此程序时,没有得到正确数量的快速女性和快速男性。快的雌性是小于-19的数字,快的雄性是小于15的数字。另外,如果有人能建议如何找到所有输入组合的平均值 #Write a program that categorizes user input #Ask for user input userInput=input("Enter a time (negative for F, "" to quit): ") #Initialize variables female=0 ma

由于某些原因,我在运行此程序时,没有得到正确数量的快速女性和快速男性。快的雌性是小于-19的数字,快的雄性是小于15的数字。另外,如果有人能建议如何找到所有输入组合的平均值

#Write a program that categorizes user input

#Ask for user input
userInput=input("Enter a time (negative for F, "" to quit): ")

#Initialize variables
female=0
male=0
noRunner=0
fastFemale=0
fastMale=0
count=0

#Categorize input into male, female, fast female, and fast male
while userInput!="":
    count=count+1
    if userInput=="0":
        userInput=noRunner
        noRunner=noRunner+1
    if str(userInput).startswith("-"):
        userInput=female
        female=female+1
        if float(userInput) >= 19.0 and float(userInput) < 0.0:
            userInput=fastFemale
            fastFemale=fastFemale+1
    elif float(userInput) > 0.0:
        male=count-female-noRunner
        if float(userInput) <= 15.0 and float(userInput) > 0.0:
            userInput=fastMale
            fastMale=fastMale+1
    userInput=input("Enter a time (negative for F, "" to quit): ")

#Computations
total=male+female
noShow=noRunner

#Print statements
print()
print("Try-Out Report")
print("-"*40)
print("Total number of runners:", count-noShow)
print("Number of runners who didn't show:", noShow)
print("female", female)
print("male", male)
print("Average time for male runners:")
print("Average time for female runners:")
print("Average time for all runners:")
print("Fast female runners:", fastFemale)
print("Fast male runners:", fastMale)
#编写一个程序,对用户输入进行分类
#请求用户输入
userInput=input(“输入时间(F为负数),“退出):”)
#初始化变量
女性=0
男性=0
noRunner=0
fastFemale=0
fastMale=0
计数=0
#将输入分为男性、女性、快速女性和快速男性
而用户输入="":
计数=计数+1
如果userInput==“0”:
userInput=noRunner
noRunner=noRunner+1
如果str(userInput).startswith(“-”):
用户输入=女性
女=女+1
如果浮点(用户输入)>=19.0且浮点(用户输入)<0.0:
userInput=fastFemale
fastFemale=fastFemale+1
elif浮点(用户输入)>0.0:
男=女诺伦纳计数
如果浮动(用户输入)为0.0:
userInput=fastMale
fastMale=fastMale+1
userInput=input(“输入时间(F为负数),“退出):”)
#计算
总数=男性+女性
noShow=noRunner
#打印报表
打印()
打印(“试用报告”)
打印(“-”*40)
打印(“跑步者总数:”,无显示计数)
打印(“未显示的跑步者人数:”,无显示)
印刷品(“女性”,女性)
印刷品(“男性”,男性)
打印(“男性跑步者的平均时间:”)
打印(“女性跑步者的平均时间:”)
打印(“所有跑步者的平均时间:”)
打印(“快速女性跑步者:”,快速女性)
打印(“快速男跑步者:”,快速男)

当您获得输入时,构建一个总和,然后除以计数

当然,在初始化计数时初始化sum=0

由于您已经删除了“-”符号,因此不需要使用abs

sum += float(userval)

avg = sum/total
请注意,您应该使用如下代码

female += 1
而不是

female = female + 1
请注意,这里的问题是,在使用输入变量之前更改了它 这使得以后的所有检查都无效。在检查值之前,也不要使输入为正,这样它将始终为负,因此永远不会>19将其更改为字符串以查找“-”是错误的,只需检查<0即可

从已经是浮点或整数的userInput开始

检查负值,然后更改为abs(userval),以获取女性类别中的实际算术值

if str(userInput).startswith("-"):
    userInput=female # This messes up the next if
    female=female+1
    if float(userInput) >= 19.0 and float(userInput) < 0.0:
        userInput=fastFemale
        fastFemale=fastFemale+1
如果str(userInput).startswith(“-”):
userInput=female#这会把下一个
女=女+1
如果浮点(用户输入)>=19.0且浮点(用户输入)<0.0:
userInput=fastFemale
fastFemale=fastFemale+1
这让我大吃一惊。使用
userInput<0
,就像您在下面的
elif
上所做的那样

    ...
    userInput=female
    ...
当您这样做时,您只是丢失了userInput值

在交互式会话中玩
输入
,看看它是如何工作的。不需要
浮动(用户输入)


代码真的很糟糕。试着从问题的一个子集开始,例如只从女性开始,试着了解发生了什么,不要只是尝试随机地调整事情来获得结果。

你可以很好地利用pythons迭代器和列表函数(
sum
len
)和-comprehensions

大概是这样的:

def prompt():
    return input('Enter a time (negative for F, "" to quit): ')

data = [float(datum) for datum in iter(prompt, '')]

females = [-datum for datum in data if datum < 0.]
males = [datum for datum in data if datum > 0.]

print ('Males average: {}'.format(sum(males) / len(males)))
print ('Females average: {}'.format(sum(females) / len(females)))
print ('Fast males: {}'.format(sum(1 for male in males if male < 15.)))

要进一步分类,您可以执行以下操作:

fastMales = [male for male in males if male < 15.]
fastFemales = [female for female in females if female < 19.]
fastMales=[如果男性<15,则男性代表男性。]
fastFemales=[如果女性<19,则女性代表女性。]

我提取了一个Stats类,它只自动跟踪适用的值。它使您的代码稍微长一点,但更易于遵循:

import sys

if sys.hexversion < 0x3000000:
    inp = raw_input   # Python 2.x
else:
    inp = input       # Python 3.x

def average(sum, num):
    return sum / (num or 1.)    # prevent div-by-0

class Stats:
    def __init__(self, title, filter_fn, neg=False):
        self.filter_fn = filter_fn
        self.neg = neg
        self.num = 0
        self.sum = 0.

    def add(self, item):
        if self.filter_fn(item):
            self.num += 1
            self.sum += -item if self.neg else item

    @property
    def avg(self):
        return average(self.sum, self.num)

female =      Stats("Female runners",      lambda x: x < 0.       , True)
fast_female = Stats("Fast female runners", lambda x: -19. < x < 0., True)
no_show =     Stats("No shows",            lambda x: x == 0.            )
fast_male =   Stats("Fast male runners",   lambda x: 0. < x < 15.       )
male =        Stats("Male runners",        lambda x: 0. < x             )

def main():
    while True:
        s = inp("Enter run time (negative for female, blank to quit): ")
        try:
            time = float(s)
            for stat in [female, fast_female, no_show, fast_male, male]:
                stat.add(time)
        except ValueError:
            break

    print("\nTryout Report\n----------------------------------------")

    print(
        "All runners: {:d} male + {:d} female = {:d}  ({:d} no-shows)"
        .format(male.num, female.num, male.num + female.num, no_show.num)
    )
    print(
        "Average times: {:0.3f} male, {:0.3f} female, {:0.3f} overall"
        .format(male.avg, female.avg, average(male.sum + female.sum, male.num + female.num))
    )
    print(
        "Fast runners: {:d} male + {:d} female = {:d}"
        .format(fast_male.num, fast_female.num, fast_male.num + fast_female.num)
    )

if __name__=="__main__":
    main()

列出既大于19又小于0的数字。然后看看你的输入。还要注意python变量是区分大小写的。
fastMales = [male for male in males if male < 15.]
fastFemales = [female for female in females if female < 19.]
import sys

if sys.hexversion < 0x3000000:
    inp = raw_input   # Python 2.x
else:
    inp = input       # Python 3.x

def average(sum, num):
    return sum / (num or 1.)    # prevent div-by-0

class Stats:
    def __init__(self, title, filter_fn, neg=False):
        self.filter_fn = filter_fn
        self.neg = neg
        self.num = 0
        self.sum = 0.

    def add(self, item):
        if self.filter_fn(item):
            self.num += 1
            self.sum += -item if self.neg else item

    @property
    def avg(self):
        return average(self.sum, self.num)

female =      Stats("Female runners",      lambda x: x < 0.       , True)
fast_female = Stats("Fast female runners", lambda x: -19. < x < 0., True)
no_show =     Stats("No shows",            lambda x: x == 0.            )
fast_male =   Stats("Fast male runners",   lambda x: 0. < x < 15.       )
male =        Stats("Male runners",        lambda x: 0. < x             )

def main():
    while True:
        s = inp("Enter run time (negative for female, blank to quit): ")
        try:
            time = float(s)
            for stat in [female, fast_female, no_show, fast_male, male]:
                stat.add(time)
        except ValueError:
            break

    print("\nTryout Report\n----------------------------------------")

    print(
        "All runners: {:d} male + {:d} female = {:d}  ({:d} no-shows)"
        .format(male.num, female.num, male.num + female.num, no_show.num)
    )
    print(
        "Average times: {:0.3f} male, {:0.3f} female, {:0.3f} overall"
        .format(male.avg, female.avg, average(male.sum + female.sum, male.num + female.num))
    )
    print(
        "Fast runners: {:d} male + {:d} female = {:d}"
        .format(fast_male.num, fast_female.num, fast_male.num + fast_female.num)
    )

if __name__=="__main__":
    main()
Enter run time (negative for female, blank to quit): -20
Enter run time (negative for female, blank to quit): -16
Enter run time (negative for female, blank to quit): -12
Enter run time (negative for female, blank to quit): 0
Enter run time (negative for female, blank to quit): 0
Enter run time (negative for female, blank to quit): 12
Enter run time (negative for female, blank to quit): 14
Enter run time (negative for female, blank to quit): 16
Enter run time (negative for female, blank to quit): 

Tryout Report
----------------------------------------
All runners: 3 male + 3 female = 6  (2 no-shows)
Average times: 14.000 male, 16.000 female, 15.000 overall
Fast runners: 2 male + 2 female = 4