我正在为我的游戏创建一个高分表。它以下列格式将值附加到.txt文件:

5.234,0,0,5234

6.345,1,1,8345

1.649,0,1,2649

2.25,0,1,3250

...等等

我想读取前10个得分(得分是每行的第4个值)并将其输出到屏幕上。我尝试使用此处的信息,但无法理解。输出它们的最佳方法是什么?

我知道您可以使用拆分值

for line in f:

Array = line.split(',')

我很确定如果我将它们放在排序的2D数组或等效数组中,就可以管理输出

解决方案

使用该csv模块将更加容易。例如:

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

scores = list(reader)

现在,scores将是10个列表的列表,每个列表有4个值。

您可以根据需要执行相同的操作split,但是必须确保正确理解所有详细信息,例如将换行符从每一行的末尾剥离(在非平凡的CSV文件中,详细信息会变得更加复杂) ):

with open('highscores.txt', 'rb') as f:

scores = [line.strip().split(',') for line in f]

现在,您可以对每个步骤使用单个理解或函数调用来一次转换列出的一个步骤。这种“声明式编程”,您只需要说说要对值做些什么,而不用编写循环并交错所有步骤,就可以使您的生活变得更加轻松。

如果只需要最后一列,则可以理解:

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

scores = [row[-1] for row in reader]

如果要将它们转换为整数:

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

scores = (row[-1] for row in reader)

intscores = [int(score) for score in scores]

…尽管在这种情况下,将两个步骤合并在一起很简单:

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

scores = [int(row[-1]) for row in reader]

如果希望它们以相反的顺序(从最高到最低)排序:

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

scores = (int(row[-1]) for row in reader)

topscores = sorted(scores, reverse=True)

如果您只想要前十名:

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

scores = (int(row[-1]) for row in reader)

topscores = sorted(scores, reverse=True)

top10 = topscores[:10]

通过使用heapq模块,您可以使最后一步更有效,但更为复杂:

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

scores = (int(row[-1]) for row in reader)

top10 = heapq.nlargest(10, scores)

从对另一个答案的评论中,您实际上希望获得每行中的所有四个值。因此,您不仅需要阅读每一行的最后一列,还需要阅读整行。另外,您可能想将第一列转换为浮点数,将其余列转换为整数,这比将函数映射到每一行中的所有列要复杂一些。同时,nlargest或sorted将按第一列进行比较,但要与最后一列进行比较,这意味着您需要提供键功能。尽管自己写一点也不难,但itemgetter已经可以满足您的要求。

with open('highscores.txt', 'rb') as f:

reader = csv.reader(f)

def convert_row(row):

return [float(row[0])] + [int(value) for value in row[1:]]

scores = (convert_row(row) for row in reader)

top10 = heapq.nlargest(10, scores, key=operator.itemgetter(-1))

for record in top10:

print('time: {} | moves: {} | penalties: {} | score: {}'.format(*record))

此代码的唯一问题是,列顺序的知识有点隐式地散布在整个代码中。如果您有字典列表而不是列表列表,则可以按名称访问值。并DictReader让您做到这一点:

with open('highscores.txt', 'rb') as f:

reader = csv.DictReader(f, fieldnames=('time', 'moves', 'penalties', 'score'))

def convert_row(row):

return {k: float(v) if k == 'time' else int(v) for k, v in row.items()}

scores = [convert_row(row) for row in reader]

top10 = heapq.nlargest(10, scores, key=operator.itemgetter('score'))

for record in top10:

print('time: {time} | moves: {moves} | penalties: {penalties} | score: {score}'

.format(**record))

format函数中不再有0、1,-1或隐式排序;现在,所有内容都使用字段名称-time,但不包括time,score等等。另一方面,代码更加冗长,并且某些人发现dict理解比列表理解/生成器表达式更难读,所以……这是一个问题品尝这是否有所改善。

python输入逗号分隔值文件_如何在Python(Pygame)中显示逗号分隔值(.txt)文件中的前10个高分...相关推荐

  1. python 输入数字变成密码_如何在python中检查数字的“密码”

    我建议使用sets和stdlib中的string包作为可接受字符的列表.在 我还建议进行一点重构,以删除大量带有if / else分支的嵌套.在import string upper = set(li ...

  2. python二进制转八进制代码_如何在python中输入二进制、八进制、十进制、十六进制数据并转换...

    最近在学习python,不过跟着课本的作业题目: 分别就计算二进制110110011.八进制256和十六进制的数字a4b5,并转化为十进制求和. 不过写过程中遇到了个问题: 如何在python中输入二 ...

  3. python语言结构化语言_如何在python中处理结构化语言文件

    我有一个像这样的大型结构化语言文件:TASK SchM_Task { TYPE = AUTO; SCHEDULE = NON; PRIORITY = 160; ACTIVATION = 1; TIMI ...

  4. python 读取日志文件_如何在Python中跟踪日志文件?

    使用SH模块(PIP安装sh):from sh import tail# runs foreverfor line in tail("-f", "/var/log/som ...

  5. python如何读取uni文件_如何在Python中通过HTTP与UniProt交谈?

    我试图从UniProt获得一些结果,这是一个蛋白质数据库(细节并不重要).我正在尝试使用一种从一种ID转换为另一种ID的脚本.我能够在浏览器上手动执行此操作,但无法在 Python中执行此操作. 在h ...

  6. python怎么去掉换行符_如何在Python中删除尾部换行符?

    如何在Python中删除尾部换行符? 什么是Perl的chomp函数的Python等价物,如果它是换行符,它会删除字符串的最后一个字符? 26个解决方案 1473 votes 尝试方法lstrip() ...

  7. python输入代码如何清除_如何清空python

    执行python命令会进入Python控制台.在Python控制台中可以用交互的方式执行Python语句.也就是执行一行Python语句,会立刻返回执行结果. 当Python控制台输入过多的Pytho ...

  8. python播放音频文件_详解使用pygame播放一段MP3音频文件

    近日,在梳理pygame模块的时候发现一个很有用的模块mixer模块,这个模块翻译过来就是混音器,它可以加载和播放音频文件,甚至可以对混音器进行设置和处理,其功能非常强大.今天,我们一起来梳理一下混音 ...

  9. python调用adb shell命令_如何在python脚本里面连续执行adb shell后面的各种命令

    如何在python脚本里面连续执行adb shell后面的各种命令 adb shell "cd /data/local && mkdir tmp" adb shel ...

最新文章

  1. 【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- 组件的使用...
  2. 展望我的2022Flag
  3. power(乘幂)函数剖析
  4. What happens when clicking interaction recor工作中心
  5. 在WebLogic 12c上运行RichFaces
  6. 【Sqoop】从MySQL同步数据到Hive的操作参数解析
  7. 无源波分和彩光模块_纯无源粗波分复用器(CWDM)部署4/5G网络,节省光缆资源...
  8. Spring注解驱动开发-----容器day01
  9. import java.io6_JavaIO(六) 转换流
  10. 【廖雪峰官方网站/Java教程】函数式编程
  11. vmware虚拟机连接网络
  12. 在实现视频播放器的步骤client(三)风行网络电影列表
  13. 现金流量表补充资料的编制公式
  14. 如何安装配置JDK(保姆级完美解决教程+附百度网盘链接)
  15. [视频架构] Docker 全家桶 (上)
  16. 如何获取OpenAI API Key
  17. 华为鸿蒙糸统其它手机可以用吗,鸿蒙系统vivo能用吗
  18. 乘积取中法matlab,遺傳算法(GA)的matlab實現
  19. 换电脑了大量数据如何迁移?
  20. 罗升阳:那两年炼就的Android内功修养

热门文章

  1. java各种包的用途
  2. DFTug - Getting Started(下篇)
  3. ecos无线驱动掉线问题解决方案分析
  4. jsp 特殊字符转义
  5. s:textfield format date
  6. JS(JavaScript)的初了解6(更新中···)
  7. python编写IP地址与十进制IP转换脚本
  8. 七牛云音视频新功能:音频支持AAC_HE
  9. 读取SBT项目resources目录中的文件
  10. PHP几个快速读取大文件例子