2017-04-26 47 views
0

我已經給出了在Python中製作高爾夫Stableford計算器程序的任務,該程序將從sys.stdin中讀取文本文件並輸出文本文件中每位高爾夫球手的Handicap分數。在文本文件中,第一行是所有18個孔中每個孔的標準桿,第二行有每個孔的索引(難度排名)。然後接下來的每一行都有高爾夫球員的名字,高爾夫球手的差點筆畫以及他們在1-18洞每個洞上的筆畫。如果高爾夫球手具有「X」分數,則該孔被忽略。如果有其他事情,那麼高爾夫球員被取消資格。如何在Python中創建高爾夫Stableford計算器

這裏是給定的文本文件:

4 5 3 4 4 5 3 5 3 5 3 4 4 4 4 5 4 3 
16 4 8 2 18 14 10 6 12 11 15 5 13 1 17 7 3 9 
Raspberry Pie 14 4 7 3 5 10 7 4 12 4 5 3 4 4 5 5 5 4 4 
Penelope Perkins 17 4 7 3 5 10 7 4 12 4 5 3 4 4 5 5 5 4 4 
Bambi 19 5 6 4 5 5 6 4 6 ; 6 4 5 5 5 5 6 5 4 
Sylvester The Cat 36 X X X X X X X X X X X X X X X X X X 
Sneezy 18 5 6 4 5 5 6 4 6 4 6 4 5 5 5 5 6 5 4 
Juninho 18 5 6 4 5 5 6 4 6 4 A 4 5 5 5 5 6 5 4 
Shere Khan 7 4 X 3 4 4 5 1 4 3 5 3 X 4 4 4 5 4 3 
Alexis de Sart 0 4 3 1 X 2 5 3 4 1 5 3 3 3 3 3 5 4 3 

下面是所需的輸出:

$ python3 stableford.py < golf.txt 
    Alexis de Sart : 47 
     Shere Khan : 40 
Penelope Perkins : 38 
      Sneezy : 36 
    Raspberry Pie : 35 
Sylvester The Cat : 0 
      Bambi : Disqualified 
      Juninho : Disqualified 

我想我已經找到了如何計算差點得分爲每位高爾夫球手。您會發現高爾夫球手在每個洞上的杆數與擊球所需的杆數之間的差異,找到差值值得的差點數(例如,+ 2 = 0,+ 1 = 1,0 = 2, -1 = 3等),並將其添加到每行開頭的讓分筆畫。我也知道我可以通過使用異常處理來取消兩位高爾夫選手的資格。

我有一個問題,搞清楚如何將名稱分配給值。我知道我可以用字典爲鍵值賦予一個值,但我不知道如何使用正則表達式獲取全名,而不會在文本文件中獲得其他字母。

這是我用來獲取到那個階段的代碼:

import sys 
import re 
par=sys.stdin.readline().split() 
Index=sys.stdin.readline().split() 
everything="".join(sys.stdin.readlines()) 
name=r"([A-Za-z][A-Za-z]*)" 
name_regex = re.compile(name) 
namelist = name_regex.findall(everything) 
for n in namelist: 
     print(n) 

我已經花了過去幾個小時,谷歌搜索從蟒蛇放在這裏過去的問題,在線指南信息,可以幫助我完成這個程序但它讓我無處可去。我明白這是一項相當大的任務,所以如果有些人可能會幫助我,我會非常感激。謝謝閱讀。

+0

不幸的是,這種類型的問題對於這個平臺太寬泛。你只應該發佈高度集中/專業化的問題描述。 – Asciiom

+0

你還會在哪裏推薦發佈? –

+0

像這樣的服務,可能是:https://hackhands.com/ – Asciiom

回答

0

如何使用str.rsplitmaxsplit的論點?

import io 

s = """Raspberry Pie 14 4 7 3 5 10 7 4 12 4 5 3 4 4 5 5 5 4 4 
Penelope Perkins 17 4 7 3 5 10 7 4 12 4 5 3 4 4 5 5 5 4 4 
Bambi 19 5 6 4 5 5 6 4 6 ; 6 4 5 5 5 5 6 5 4 
Sylvester The Cat 36 X X X X X X X X X X X X X X X X X X 
Sneezy 18 5 6 4 5 5 6 4 6 4 6 4 5 5 5 5 6 5 4 
Juninho 18 5 6 4 5 5 6 4 6 4 A 4 5 5 5 5 6 5 4 
Shere Khan 7 4 X 3 4 4 5 1 4 3 5 3 X 4 4 4 5 4 3 
Alexis de Sart 0 4 3 1 X 2 5 3 4 1 5 3 3 3 3 3 5 4 3""" 

file = io.StringIO(s) 
for line in file: 
    name, handicap, *scores = line.rstrip().rsplit(maxsplit=19) 
    print('{} | {} | {}'.format(name, handicap, scores)) 

# Output 
# Raspberry Pie | 14 | ['4', '7', '3', '5', '10', '7', '4', '12', '4', '5', '3', '4', '4', '5', '5', '5', '4', '4'] 
# Penelope Perkins | 17 | ['4', '7', '3', '5', '10', '7', '4', '12', '4', '5', '3', '4', '4', '5', '5', '5', '4', '4'] 
# Bambi | 19 | ['5', '6', '4', '5', '5', '6', '4', '6', ';', '6', '4', '5', '5', '5', '5', '6', '5', '4'] 
# Sylvester The Cat | 36 | ['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'] 
# Sneezy | 18 | ['5', '6', '4', '5', '5', '6', '4', '6', '4', '6', '4', '5', '5', '5', '5', '6', '5', '4'] 
# Juninho | 18 | ['5', '6', '4', '5', '5', '6', '4', '6', '4', 'A', '4', '5', '5', '5', '5', '6', '5', '4'] 
# Shere Khan | 7 | ['4', 'X', '3', '4', '4', '5', '1', '4', '3', '5', '3', 'X', '4', '4', '4', '5', '4', '3'] 
# Alexis de Sart | 0 | ['4', '3', '1', 'X', '2', '5', '3', '4', '1', '5', '3', '3', '3', '3', '3', '5', '4', '3'] 
+0

工作。我實際上做了一個小小的改變,而不是說s =「Raspberry .....」,我讓s =「」。join(sys.stdin.readlines),所以當程序執行時它實際上打開了golf.txt文件,我得到了和你一樣的輸出。謝啦。 –

+0

您可以將循環更改爲'for sys.stdin:'中的行。它會自動從stdin中爲你抓取每一行。 'io.StringIO'類僅僅用於處理字符串,如文件。 – Harvey

+0

或者如果你有一個golf.txt文件....'打開('golf.txt')作爲f:對於f中的行:...' – Harvey

0

在高爾夫球場中,規則課程上的每個洞都是根據難度來排名的,這在您的數據集中是有難度的。但是,當計算某個洞的高爾夫球員淨得分時,您必須考慮該課程的障礙。例如,如果高爾夫球是10個差點,那麼他/她只會爲最困難的10個洞獲得差點擊。

這裏是兩個例子 高爾夫球手的障礙:10 孔#4,難度4,高爾夫球手的總得分:8,高爾夫球手的淨評分:7 孔#7,難度12,高爾夫球手的總得分:6,高爾夫球手的淨得分:6(在這種情況下淨和總數相同,因爲高爾夫球員的讓分是10,洞難度是12)

+0

總分和淨分之間有什麼區別? –

+0

每洞,總得分是高爾夫球手對洞的投籃次數。一個洞的淨得分是總得分減去高爾夫球手的差點數。讓球盤球的難度和高爾夫球手的障礙是基於盤口的。 – drsnark