设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: mty1111
打印 上一主题 下一主题

【Python 第33课】 处理文件中的数据

[复制链接]

0

主题

0

好友

46

积分

新手上路

Rank: 1

楼主
发表于 2016-6-28 15:12:02 |显示全部楼层
本帖最后由 Yumiao_HyunMin 于 2016-6-28 15:13 编辑

想问个问题,如果想让输出的总成绩按照每个人总分降序排列要怎么写?我在results.append(result)后面用了lambda但不太会用,排列出来并不是降序或者是升序的:
results.sort(key=lambda l: (l[1]), reverse = True)

应该写呢?新手求教
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

沙发
发表于 2016-6-29 15:47:59 |显示全部楼层
crossin先生 发表于 2016-6-29 14:24
排序本身写的没问题,你的results是什么格式的,l[1]表示用每一项的第2个元素来排序 ...

我在for 里面输出results以后,中文名字都是用\x跟着十六进制数来表示:
  1. ['\xe5\x88\x98\xe5\xa4\x87 \t: 200\n']
  2. ['\xe5\x88\x98\xe5\xa4\x87 \t: 200\n', '\xe5\x85\xb3\xe7\xbe\xbd \t: 205\n']
  3. ['\xe5\x88\x98\xe5\xa4\x87 \t: 200\n', '\xe5\x85\xb3\xe7\xbe\xbd \t: 205\n', '\xe5\xbc\xa0\xe9\xa3\x9e \t: 376\n']
  4. ['\xe5\xbc\xa0\xe9\xa3\x9e \t: 376\n', '\xe5\x88\x98\xe5\xa4\x87 \t: 200\n', '\xe5\x85\xb3\xe7\xbe\xbd \t: 205\n', '\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae \t: 100\n']

  5. 需要先decode中文字符吗?还是可以跳过中文名字比较成绩呢
复制代码
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

板凳
发表于 2016-6-30 12:54:40 |显示全部楼层
crossin先生 发表于 2016-6-29 16:33
这样肯定没法比的,你得把分数分离出来,变成数字类型才能比较大小排序,比如把每一项都变成
['xxxx', 20 ...

先生您好!我改了下代码把四个人的成绩变成了四个list:
  1. # -*- coding: utf-8 -*-
  2. import re
  3. f = file('score.txt')
  4. lines = f.readlines()
  5. #print lines
  6. f.close()

  7. results = []

  8. for line in lines:
  9.     #print line
  10.     data = line.split()
  11.     #print data

  12.     sum = 0
  13.     for score in data[1:]:
  14.         sum += int(score)
  15.         result = '%s \t: %d\n' % (data[0], sum)
  16.         #print result
  17.     score = re.findall(r"\d+\.?\d*", result)

  18.     for s in score:
  19.         s = str(s)
  20.         results = []
  21.         results.append('%s \t:' % data[0])
  22.         results.append(s)
  23.         results.sort(key=lambda l: (l[1]), reverse = True)
  24.         #print results
  25.         output = file('result.txt', 'w')
  26.         print results
  27.         output.writelines(results)
  28.         output.close()
复制代码
最后输出results可以看到是这样的:
  1. ['\xe5\xbc\xa0\xe9\xa3\x9e \t:', '200']
  2. ['\xe5\x88\x98\xe5\xa4\x87 \t:', '205']
  3. ['\xe5\x85\xb3\xe7\xbe\xbd \t:', '376']
  4. ['\xe6\x9b\xb9\xe6\x93\x8d \t:', '100']
复制代码
但是排序还是没起到作用,并且在result.txt里只输出了最后一个人的100分,这是为什么呀。。
回复

使用道具 举报

0

主题

0

好友

46

积分

新手上路

Rank: 1

地板
发表于 2016-6-30 17:06:11 |显示全部楼层
crossin先生 发表于 2016-6-30 15:09
你的results应该是包含所有结果的整个list,而不是分4次做。你现在是循环了4次,每次拿其中一个,然后完 ...

谢谢先生!已经成功啦
  1. # -*- coding: utf-8 -*-
  2. import re
  3. f = file('score.txt')
  4. lines = f.readlines()
  5. #print lines
  6. f.close()

  7. list = []

  8. for line in lines:
  9.     #print line
  10.     data = line.split()
  11.     #print data

  12.     sum = 0
  13.     for score in data[1:]:
  14.         sum += int(score)
  15.         result = '%s \t: %d\n' % (data[0], sum)
  16.        # print result
  17.     score = re.findall(r"\d+\.?\d*", result)

  18.     for s in score:
  19.         s = int(s)
  20.         results = []
  21.         results.append('%s \t:' % data[0])
  22.         results.append(s)
  23.         #results.sort(key=lambda l: (l[1]), reverse = True)
  24.         #print results
  25.         i=0
  26.         list.insert(i, results)
  27.         i+=1
  28.         list.sort(key=lambda l: (l[1]), reverse = True)
  29.         #print list
  30.     output = file('result.txt', 'w')
  31.     for i in list:
  32.         k=' '.join([str(j) for j in i])
  33.         output.write(k+"\n")
  34.     output.close()
复制代码
不过觉得自己写的好麻烦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-6 19:32 , Processed in 0.030478 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部