日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2025/4/5 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python输入逗号分隔值文件_如何在Python(Pygame)中显示逗号分隔值(.txt)文件中的前10个高分... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在為我的游戲創建一個高分表。它以下列格式將值附加到.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个高分...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。