Python - 从文本文件按字母顺序排列最高的

时间:2015-03-18 19:19:55

标签: python

我使用python进行了测验,最终得分为10分。从此测验中,每个用户的姓名,班级和分数都保存在文本文件中。现在我要做的是创建一个新程序,它可以按字母顺序组织用户名,只有用户得分最高并打印出来。到目前为止,我已成功按字母顺序组织用户名。 这是我的代码到目前为止的样子

def alpha():
  b = open("Class X.txt" , "r")
  fo = b.readlines()
  for x in sorted (fo): 
      print(x)
def beta():
  b = open("Class Y.txt" , "r")
  fo = b.readlines()
  for x in sorted(fo):
      print(x)
def charlie():
  b = open("Class Z.txt" , "r")
  fo = b.readlines()
  for x in sorted(fo):
      print(x)

if option == "A":
  if Class == "X":
    alpha()

  elif Class == "Y":
    beta()

  elif Class == "Z":
    charlie()`

我一直尝试做的是从所需类中的文本文件中按字母顺序打印所有用户名,这是我成功的。但是,我一直在努力尝试打印每个用户的最高分,而不是他们的任何分数。

每个学生的姓名和分数都是这样保存的(Nakita:0),每个文本文件都保存在三个类别X,Y和Z.

我想知道是否有人可以帮我弄清楚如何用字母顺序包含用户名称的最高分,就像我已经完成的那样,从文本文件中已经设置了如上所示。我还使用了Python 3.3.2版本。

2 个答案:

答案 0 :(得分:0)

首先,我可能会使用defaultdict使用学生姓名作为键,值是他们的分数列表。 defaultdict只需在第一次访问时初始化,在本例中为空列表。

from collections import defaultdict

scores = defaultdict(list)

接下来,您可以通过创建要处理的文件名列表来压缩脚本,然后将其用作外部循环,这样您就不必重复一遍:

def alpha():
  b = open("Class X.txt" , "r")
  fo = b.readlines()
  for x in sorted (fo): 
      print(x)
def beta():
  b = open("Class Y.txt" , "r")
  fo = b.readlines()
  for x in sorted(fo):
      print(x)
def charlie():
  b = open("Class Z.txt" , "r")
  fo = b.readlines()
  for x in sorted(fo):
      print(x)

变成:

class_filenames = ['Class X.txt', 'Class Y.txt', 'Class Z.txt']

for class_file in class_filenames:
    with open(class_file, 'r') as f:
        ...

最后,对于循环体,我们需要将每一行拆分为名称和分数(作为整数)并将它们添加到正确的条目中,这很容易完成:

for line in f.readlines():
    student, score = line.split(':')
    scores[student].append(int(score))

然后我们可以通过使用sorted迭代器对最终字典进行排序来按字母顺序打印每个名称,并为每个学生打印得分列表的max

for student, scorelist in sorted(scores.items()):
    print("%s : %d" % (student, max(scorelist)))

现在一起:

from collections import defaultdict

scores = defaultdict(list)

class_filenames = ['Class X.txt', 'Class Y.txt', 'Class Z.txt']

for class_file in class_filenames:
    with open(class_file, 'r') as f:
        for line in f.readlines():
            student, score = line.split(':')
            scores[student].append(int(score))

for student, scorelist in sorted(scores.items()):
    print("%s : %d" % (student, max(scorelist)))

答案 1 :(得分:0)

如果您有3个具有相同名称的文件,则代码可以是:

lstX = []
lstY = []
lstZ = []
b = open("Class X.txt" , "r")
lstX = b.read().split('\n')
lstX.sort()
b.close()
b = open("Class Y.txt" , "r")
lstY = b.read().split('\n')
lstY.sort()
b.close()
b = open("Class Z.txt" , "r")
lstZ = b.read().split('\n')
lstZ.sort()
b.close()

lst = []
lst.append(lstX)
lst.append(lstY)
lst.append(lstZ)

res = []
for i in range(len(lst)):
    for q in range(len(lst[i])):
        res.append(int(lst[q][i].split(':')[1]))
    print("%s max. = %s" % (lst[q][i].split(':')[0], max(res)))
    res = []

注意:对于此代码,文本文件在最后一条记录后不得有新行! 例如,文件" Class X.txt"看着这样:

Nakita:0
Makita:1
Zakita:7