2017-05-04 157 views
-2

我試圖寫一段代碼,它將文本文件中行的某些數字乘以3.但是,每行都有字符串,每個數字之間用逗號隔開。這是爲了一款遊戲排行榜,我只是想學習和練習Python。每一行都有玩家的暱稱,比賽出場,比賽勝負和比賽失分列表,每個項目用逗號分隔(無空格),每名球員已經打了24場比賽。如何從文本文件中的行中乘以數字?

從文本文件中的一行的一個示例是:

DarrenL,24,12,12 
Philippa93,24,9,15 
TommyBoy,24,0,24 

的目的:

  • 閱讀文本文件轉換成代碼(完成)
  • 採取每場比賽獲勝並將其乘以3

這裏是我已經代碼:

print("Leaderboard") 
print("Only players who have won one or more matches will be displayed") 
results = open('results.txt', 'r').readlines() 
with open('results.txt', 'r') as leaderboard: 
    import re 
    output = [] 
    with open('firesideResults.txt.txt') as file: 
     for line in file: 
      matchesWon = re.search(r'\d+,?\d*', line) 
      if matchesWon: 
       points = output.append(float(matchesWon.group())) 
       print(points * 3) 

與代碼的問題是,它並沒有實際打印從實際的文本文件,任何東西。

+0

對於一個問題有很多問題。你應該採取更小的步驟。例如:(1)讀取文件,並逐行重新打印。 (2)提取每行贏得的比賽數量並打印。 (3)計算每行的分數(3 *贏得的比賽)並打印出來。 (4)如果沒有贏得比賽,不要打分。 **不要採取下一步,直到目前的工作。** – mkrieger1

+0

哪些價值是「比賽贏」?建議你用['csv'](https://docs.python.org/3/library/csv.html#module-csv)模塊讀取文件,因爲這是它的文件類型(並且會比使用正則表達式來解析這些行)。 – martineau

+0

首先,你正在使用'open'三次。它只能使用一次。 – mkrieger1

回答

1

而不是使用正則表達式,你可以使用split()

返回的字符串中的單詞的列表,使用作爲分隔符的字符串。

例如:

>>> "DarrenL,24,12,12".split() 
['DarrenL,24,12,12'] 

使用Python 3.5,你可以使用Unpacking Generalizations來分隔,例如:

>>> line = "DarrenL,24,12,12" 
>>> name, *points = line.split(',') 
>>> name 
'DarrenL' 
>>> points 
['24', '12', '12'] 

的Python 3.5之前,可以這樣寫:

parts = line.split(',') 
name = parts[0] 
points = parts[1:] 

轉換到int和由3乘法,可以與理解列表來完成:

points = [int(x) * 3 for x in points] 

下面是結果代碼:

lines = [ 
    "DarrenL,24,12,12\n", 
    "Philippa93,24,9,15\n", 
    "TommyBoy,24,0,24\n"] 

for line in lines: 
    line = line.strip() 
    name, *points = line.split(",") 
    points = [int(x) * 3 for x in points] 
    print(name, *points) 

打印:

DarrenL 72 36 36 
Philippa93 72 27 45 
TommyBoy 72 0 72 

如果您確實需要RegEx,您可以使用re.findall()

返回模式所有非重疊的比賽中,作爲字符串列表。

import re 
print(re.findall(r"\d+", "DarrenL,24,12,12\n")) 

您將獲得:

['24', '12', '12'] 
0

這裏是一個開始:

file = open('results.txt').readlines() 

file = [i.strip('\n').split(',') for i in file] 
現在

,你這是存儲所有數據atributes的二維列表。

updated = {i[0]:map(int, i[1:]) for i in file} 

final_updated = {a:[b[i] if i == 0 or i == 2 else b[i]*3 for i in range(len(b))] for a, b in updated.items()] 

如果你只是想乘以3的所有球員和他們的分數上市:

for player, scores in final_updated.items(): 
    print player, scores 

如果你只是想給玩家怎麼沒有在任何比賽得分爲零:

for player, scores in final_updated.items(): 
    if 0 not in scores: 
     print player, scores 
+0

非常感謝你,這工作完美!對不起,你進一步打擾你,但你知道如何使它只能乘以線路中的某些數字嗎?我嘗試將'.split(',')'改爲'.split('19'')','.split('19',',')'和其他變體,但沒有一個能夠工作。再次對不起我的無能,我是新來的編碼。 – Kyle341

+0

沒問題。你在考慮乘法的地方有哪些「列」?例如,如果您只想要第一列分數,您只能通過索引訪問它,換句話說,通過其位置找到數組中的元素。如果它是一個特定的序列,你可以使用範圍函數和模。 – Ajax1234

+0

在文本文件中,每個值分別稱爲「玩家暱稱」,「匹配已玩」,「匹配已贏」和「匹配已丟失」。每場比賽都贏得了三分,因此如果比賽獲勝= n,那麼他們的積分將是n * 3。因此,DarrenL,例如,'DarrenL,24,36,12'而不是'DarrenL,24,12,12'。在我的腦海中,我知道這將如何工作,但我無法弄清楚如何將它變成Python。 – Kyle341

相關問題