【问题标题】:Finding total and average salaries from 1000 lines of text从 1000 行文本中查找总工资和平均工资
【发布时间】:2014-06-20 00:43:30
【问题描述】:

我需要编写一个 python 程序来读取 1000 行文本,并计算每个教授类别(助理、副教授、全职、所有教员)的总工资和平均工资。问题来了:

一所大学将其员工工资发布在 http://cs.armstrong.edu/liang/data/Salary.txt。文件中的每一行 由教师的名字、姓氏、职级和薪水组成(见 练习 13.16)。编写程序显示总工资 助理教授、副教授、正教授等 教师,分别显示助理的平均工资 教授、副教授、正教授和所有教职员工, 分别。

这是我目前的代码:

import urllib.request

def main():
    infile = urllib.request.urlopen('http://cs.armstrong.edu/liang/data/Salary.txt')
    s = infile.read().decode().splitlines()

    asstTotal = 0
    asstCount = 0
    asscTotal = 0
    asscCount = 0
    fullTotal = 0
    fullCount = 0

    for line in s:
        if "assistant" in line:
            asstCount += 1
            asstTotal += int(float(s[3]))

        if "associate" in line:
            asscCount += 1
            asscTotal += int(float(s[3]))

        if "full" in line:
            fullCount += 1
            fullTotal += int(float(s[3]))

    allFacTotal = asstTotal + asscTotal + fullTotal
    avgAsst = int(asstTotal / asstCount)
    avgAssc = int(asscTotal / asscCount)
    avgFull = int(fullTotal / fullCount)
    avgAll = int(allFacTotal / 1000)

    print("Total assistant professor salary is", asstTotal)
    print("Total associate professor salary is", asscTotal)
    print("Total full professor salary is", fullTotal)
    print("Total faculty salary is", allFacTotal)
    print("Average assistant professor salary is", avgAsst)
    print("Average associate professor salary is", avgAssc)
    print("Average full professor salary is", avgFull)
    print("Average faculty salary is", avgAll)

main()

我不知道如何从各自的教授级别中获取薪水,并对它们进行总计和平均。任何意见将不胜感激!

结果:

Total assistant professor salary is 24306418
Total associate professor salary is 27235856
Total full professor salary is 27631726
Total faculty salary is 79174000
Average assistant professor salary is 79174
Average associate professor salary is 79174
Average full professor salary is 79174
Average faculty salary is 79174

【问题讨论】:

  • 此代码甚至在语法上都无效,因为您在 URL 上省略了引号,并且没有在 for 循环中放置任何正文。请发布一个语法上有效的示例并展示它到目前为止的作用。
  • @Dan,感谢您指出 URL 上的引号。我的for 循环是空的,因为我不确定从什么开始,但我添加了一些内容。
  • line 上使用strip() split()。然后使用int() 将字符串更改为整数。并使用print 看看你会得到什么——学习一些东西。
  • @annabananana7,代码示例的格式仍然错误,由于if块的缩进不正确而无法编译。你真的按照这里所示的方式尝试过吗?请整理一个完整的示例,运行它,然后解释你得到的输出与你想要的有什么不同。 (否则我们只是在为你做作业......)
  • 另一个问题是您正在将整个文件内容读入字符串s。字符串对象没有 readline() 方法,所以如果你实际运行它,你也应该在那里得到一个错误。你应该做的更像是for line in s.splitlines():

标签: python sum average


【解决方案1】:

这可以用来解释任何类型的排名,方法是在字典中为每个职位建立一个薪酬列表,然后简单地将总和除以长度。

我的例子:

import urllib.request

def main():
    infile = urllib.request.urlopen('http://cs.armstrong.edu/liang/data/Salary.txt')
    s = infile.read().decode().splitlines()

    pays = {}

    for line in s:
        *name, rank, pay = line.split()
        pays[rank] = pays.get(rank, []) + [float(pay)]

    for rank, sals in pays.items():
        avg = sum(sals) / len(sals)
        print("{:>10} ({:3}): ${:,.2f}".format(rank.title(), len(sals), avg))


if __name__ == '__main__':
    main()

还有输出:

Associate (344): $83,849.26
     Full (349): $102,229.37
Assistant (307): $65,949.55

【讨论】:

  • 不错的解决方案。超级 Python-ic,尤其是 Py3k 功能:)
【解决方案2】:
import urllib.request

def main():
    infile = urllib.request.urlopen("http://cs.armstrong.edu/liang/data/Salary.txt")

    asstSalTotal = 0
    asstTotal = 0
    asscSalTotal = 0
    asscTotal = 0
    fullSalTotal = 0
    fullTotal = 0

    for line in infile.readlines():
        data = line.decode().split()
        designation = data[2]
        if designation == "assistant":
            asstSalTotal += float(data[3])
            asstTotal += 1
        elif designation == "associate":
            asscSalTotal += float(data[3])
            asscTotal += 1
        elif designation == "full":
            fullSalTotal += float(data[3])
            fullTotal += 1

    allSalTotal = asstSalTotal + asscSalTotal + fullSalTotal
    allTotal = asstTotal + asscTotal + fullTotal

    print("Total Salary:\n\tAssistant:\t%d\n\tAssociate:\t%d\n\tFull:\t%d\n\tAll:\t%d\n\nAvg Salary:\n\tAssistant:\t%d\n\tAssociate:\t%d\n\tFull:\t%d\n\tAll:\t%d\n" % (asstSalTotal, asscSalTotal, fullSalTotal, allSalTotal, asstTotal, asscTotal, fullTotal, allTotal))


main()

【讨论】:

    【解决方案3】:

    在 python2.7 中,使用urllib2.urlopen 并将工资按标题与表格组合在一起。

    在python3中,使用urllib.request.urlopen并将print ..改为print(..)

    import urllib2
    
    rs = urllib2.urlopen('http://cs.armstrong.edu/liang/data/Salary.txt')
    title_salaries = {}
    
    for line in rs.read().split("\n"):
        _, _, title, salary = line.split(' ')
        if not title_salaries.has_key(title):
            title_salaries[title] = []
    
        title_salaries[title].append(float(salary))
    
    for title, salaries in title_salaries.items():
        print title
        print 'avg:', sum(salaries) / len(salaries)
        print 'total:', sum(salaries)
        print
    

    【讨论】:

    • 这是 Python 2.7。 @annabananana7 没有这么明确地说,但她使用基于 print 的 Python 3 作为函数而不是语句。因此urllib.request.
    • @Dan,感谢您的关注,答案已更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2019-03-24
    • 2019-01-25
    • 1970-01-01
    • 2020-08-09
    • 2021-09-09
    相关资源
    最近更新 更多