日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

我正在為我的游戲創(chuàng)建一個高分表。它以下列格式將值附加到.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數(shù)組或等效數(shù)組中,就可以管理輸出

解決方案

使用該csv模塊將更加容易。例如:

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

reader = csv.reader(f)

scores = list(reader)

現(xiàn)在,scores將是10個列表的列表,每個列表有4個值。

您可以根據(jù)需要執(zhí)行相同的操作split,但是必須確保正確理解所有詳細信息,例如將換行符從每一行的末尾剝離(在非平凡的CSV文件中,詳細信息會變得更加復(fù)雜) ):

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

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

現(xiàn)在,您可以對每個步驟使用單個理解或函數(shù)調(diào)用來一次轉(zhuǎn)換列出的一個步驟。這種“聲明式編程”,您只需要說說要對值做些什么,而不用編寫循環(huán)并交錯所有步驟,就可以使您的生活變得更加輕松。

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

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

reader = csv.reader(f)

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

如果要將它們轉(zhuǎn)換為整數(shù):

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模塊,您可以使最后一步更有效,但更為復(fù)雜:

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

reader = csv.reader(f)

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

top10 = heapq.nlargest(10, scores)

從對另一個答案的評論中,您實際上希望獲得每行中的所有四個值。因此,您不僅需要閱讀每一行的最后一列,還需要閱讀整行。另外,您可能想將第一列轉(zhuǎn)換為浮點數(shù),將其余列轉(zhuǎn)換為整數(shù),這比將函數(shù)映射到每一行中的所有列要復(fù)雜一些。同時,nlargest或sorted將按第一列進行比較,但要與最后一列進行比較,這意味著您需要提供鍵功能。盡管自己寫一點也不難,但itemgetter已經(jīng)可以滿足您的要求。

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函數(shù)中不再有0、1,-1或隱式排序;現(xiàn)在,所有內(nèi)容都使用字段名稱-time,但不包括time,score等等。另一方面,代碼更加冗長,并且某些人發(fā)現(xiàn)dict理解比列表理解/生成器表達式更難讀,所以……這是一個問題品嘗這是否有所改善。

總結(jié)

以上是生活随笔為你收集整理的python输入逗号分隔值文件_如何在Python(Pygame)中显示逗号分隔值(.txt)文件中的前10个高分...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。