【问题标题】:Select and sort integers/strings from a text file in Python从 Python 中的文本文件中选择和排序整数/字符串
【发布时间】:2014-09-28 18:25:41
【问题描述】:

我有以下文本文件 (Results.txt),当前设置如下:

Sophie
3
6
9
Laura
8
5
15
Alan
10
4
6

我正在尝试以不同的方式选择和排序这些数据。到目前为止,我的代码如下所示:

file = open('Results.txt', 'r')
lines = file.read().splitlines()
a = int(lines[1])
b = int(lines[2])
c = int(lines[3])
d = int(lines[5])
e = int(lines[6])
f = int(lines[7])
g = int(lines[9])
h = int(lines[10])
i = int(lines[11])
name1=lines[0]
name2=lines[4]
name3=lines[8]
allnames=[name1, name2, name3]
allnames.sort()
student1 = [a,b,c]
student2 = [d,e,f]
student3 = [g,h,i]
s1high=max(student1)
s2high=max(student2)
s3high=max(student3)

file.close()

我希望我的程序能够:

  • 按字母顺序对测试结果进行排序,并显示学生的最高分。
  • 按平均分从高到低排序。
  • 按最高分从高到低排序。

...并将其输出到屏幕

如您所见,我已经开始从文本文件中导入结果并将其转换为整数,但肯定有一些更快的方法可以做到这一点?

【问题讨论】:

    标签: python sorting text int alphabetical


    【解决方案1】:

    看看这是不是你想要的

    要从文件中读取内容,您可以使用

    s = {lines[i]:[float(k) for k in lines[i+1:i+4]] for i in range(0,len(lines),4)}
    

    这给出了一个学生字典和类似这样的标记

    s = {'Laura': [8, 5, 15], 'Sophie': [3, 6, 9], 'Alan': [10, 4, 6]}
    

    您可以使用按字母排序

    for i in sorted(s.keys()):
        print i,max(s[i])
    

    类似地根据平均排序

    # function which returns avg mark given the name  
    avg_mark = lambda name:sum(s[name])/len(s[name])
    for i in sorted(s.keys(),key=avg_mark,reverse=True):
        print i,avg_mark(i)
    

    类似地根据最高分进行排序

    # function which returns highest mark given the name
    high_mark = lambda name:max(s[name])  
    for i in sorted(s.keys(),key=high_mark,reverse=True):
        print i,high_mark(i)
    

    希望这会对您有所帮助。如果您需要任何解释,请随时发表评论

    【讨论】:

    • 感谢您的回复。我尝试添加 dict 代码并根据字母代码进行排序,但我的程序仍然没有输出任何内容。难道我做错了什么?感谢您的帮助。
    • 没有错误,它符合得很好。只是没有输出数据!
    • 尝试在 dict 行之后打印 s,看看你运行的是不是你编辑过的同一个文件,编辑后检查你是否保存了文件....
    • 工作出色。太感谢了。如果您能进一步帮助我并解释字典是如何编译的,我将不胜感激?文本和整数之间的条件如何确定?
    • 感谢您的帮助。您可能是网络上最有帮助的人!
    【解决方案2】:

    我不知道您所说的“...并显示学生最高分 按平均分排序,从最高到最低 按最高分排序,从最高到最低...”

    也许这个小代码会让你开始你想做的事情。

    file = open('Results.txt', 'r')
    lines = file.read().splitlines()
    my_dict = {}
    key = None
    
    # creating a dict with your data
    for line in lines:
        if line.isalpha():
            key = line
            my_dict[key] = []
        else:
            my_dict[key].append(int(line))
    
    # printing your data 
    # iterating on sorted by key dict
    for student in sorted(my_dict):
        print(student)
        # iterating the sorted list
        for score in sorted(my_dict[student], reverse=True):
            print(score)
    

    【讨论】:

    • 文本文件中的数字与学生考试成绩的分数相关。每个学生三个。
    • 我知道第一个 for 循环在文本和整数之间确定并相应地将它们添加到 dict 中,但是第二个呢?我无法弄清楚程序如何确定什么是学生以及什么是分数?
    • 我在代码中添加了一些 cmets。第一个 for 循环(在第二部分)对学生姓名(键)进行排序。第二个 for 循环对每个学生的成绩列表进行降序排序
    【解决方案3】:

    也许是这样的?在 CPython 2.[67]、CPython 3.[01234]、Pypy 2.4.0、Pypy3 2.3.1 和 Jython 2.7b3 上运行:

    #!/usr/local/cpython-3.4/bin/python
    
    # pylint: disable=superfluous-parens
    # superfluous-parens: Parentheses are good for clarity and portability
    
    '''Get student grades'''
    
    # port pprint
    import decimal
    import collections
    
    
    def main():
        '''Main function'''
        students = collections.defaultdict(list)
        with open('input', 'r') as file_:
            for line in file_:
                line_sans_newline = line.rstrip('\n')
                if line_sans_newline.isalpha():
                    name = line_sans_newline
                else:
                    students[name].append(decimal.Decimal(line))
        names = list(students)
        names.sort()
        for name in names:
            max_grade = max(students[name])
            print('{0} {1}'.format(name, max_grade))
    
    main()
    

    HTH

    【讨论】:

      【解决方案4】:
      val=[]
      keys=[]
      i=0
      l=[]
      lines=open('Result.txt','r').readlines()
      for line in lines:
        try:
          val.append(int(line))
        except:
          keys.append(line)
      
      for i in range(0,len(val),3):
       h=val[i:i+3]
       h.sort()
       l.append(h[::-1])
      print 'Sort the test results alphabetically and show the students highest score.\n'
      for i,j in zip(keys,l):
          print i,j
      
      print 'Sort by the average score, highest to lowest.'
      avlist=[float(sum(i))/len(i) for i in l ]
      print avlist
      while(len(avlist)):
          for i,j in zip(keys,avlist):
              if j==max(avlist):
                print i,j
                avlist.remove(j)
      
      print '\nSort by the highest score, highest to lowest.\n'
      hlist=[max(i) for i in l ]
      hlist.sort()
      hlist=hlist[::-1]
      for k in hlist:
          for i,j in zip(keys,l):
              if max(j)==k:
                  print i,j
      

      结果:

      Sort the test results alphabetically and show the students highest score.
      
      Sophie
      [9, 6, 3]
      Laura
      [15, 8, 5]
      Alan
      [10, 6, 4]
      
      Sort by the average score, highest to lowest.
      
      [6.0, 9.333333333333334, 6.666666666666667]
      Laura
      9.33333333333
      Alan
      6.66666666667
      Sophie
      6.0
      
      Sort by the highest score, highest to lowest.
      
      Laura
      [15,8,5]
      Alan
      [10,6,4]
      Sophie
      [9,6,3]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 2017-08-17
        相关资源
        最近更新 更多