2015-05-09 62 views
2

好吧,技術上我被分配一個任務來完成,它涉及循環(同時,對等),我遇到了一個問題:如何閱讀夾着一個特定字符之間的數據(Python的3.3)

有人問我存儲在一個列表格式的得分和用戶名,級別等這樣的:

# <username>, <level>, <level_score> - Like this: 
['buzzysin,5,100','apple_maple,3,60','choco_charlie,2,25','buzzysin,1,10'] 

我需要做的就是使用這些數據創建一個記分牌,但我似乎無法隔離分數來自列表中的字符串。這裏是我的代碼片段:

def scoreboard(): 
    name = input("Enter a username: ") # Say 'buzzysin' 
    t = open('scores.txt', 'r') 
    a = t.readlines() 
    b = [] 
    t.close() 
    for i in range(len(a)): 
     if name not in a[i]: 
      pass 
     else: # Here I need to get the occurences of 'buzzysin' and append it to b 
      b.append(a[i]) 
    #Then I need to extract the level and scores, but here's where I'm stuck :-(

我的記分牌需要是這樣的:

>>> scoreboard() 
Please enter a name: buzzysin 
The scores for buzzysin are: 

    Level Scores 
----------------------- 
     1  10 
     2   0 
     3   0 
     4   0 
     5  100 

>>> 

請幫幫忙,

'buzzysin'

+0

我不看你怎麼從數據線你上面顯示獲得記分牌的數字。請解釋。 –

+0

只是說,活動說爲每個級別使用最高值,所以因爲沒有2到4級的分數,所以他們不得不被替換爲0. – BUZZYSIN

+0

第3級和第2級有一個分數 –

回答

0

轉到模塊化!編寫一個單獨的函數來解析每一行,使用它來解析所有行,然後過濾出相關人員的分數。列表理解爲這是偉大的:

def parse_line(line): 
    """parse a score line, returning its data 

    A score line is of the form: <username>,<level>,<level_score> 

    The level and score are integers. 
    """ 
    parts = line.split(',') 
    if len(parts) != 3: 
     return None # or raise an exception 
    name = parts[0] 
    level = int(parts[1]) 
    level_score = int(parts[2]) 
    return name, level, level_score 

# read the lines 
with open('scores.txt', 'r') as t: 
    lines = t.readlines() 

# parse the lines, ignoring empty lines 
scores = [parse_line(line) for line in lines if line != ""] 

# get the person's name 
name = input("Enter a username: ") # Say 'buzzysin' 

# filter that person's scores 
persons_scores = [score for score in scores if score[0] == name] 

# now print your table... 
+0

對不起 - 我不確定我是否理解......我是一位Python的超級新手。你能解釋一下嗎? 此外,我應該提到這較早,但如果有兩個不同的分值多次出現在同一水平線上: [「buzzysin,2,30」,「buzzysin,2,45」] 我打算顯示最高的兩個 - >'buzzysin,2,45' – BUZZYSIN

+0

哪些部分不清楚?這裏是關於[list comprehensions](http://www.pythonforbeginners.com/basics/list-comprehensions-in-python)和[with statement]的簡短介紹(http://preshing.com/20110920/the-python -with語句按示例/)。 – taleinat

+0

至於選擇每個級別的最高分數,這完全是一個不同的問題。歡迎您就此打開一個單獨的問題。 – taleinat

1

首先,for i in len(a)會引發異常,因爲整數是不可迭代的。您要麼直接迭代a,要麼迭代range(len(a))之類的索引列表。其次,如果a中的行格式如下buzzysin,5,100您應該使用string.startswith intent in(節省很多時間)。然後,如果一個字符串以buzzysin開頭,則可以用string.split(',')解析該字符串以獲得分數。例如,

for line in a: 
    if line.startswith(player_name): 
     name, level, score = line.rstrip().split(',') 
+0

謝謝 - 菜鳥錯誤... – BUZZYSIN

0

只需使用.split(',')

lines = ['buzzysin,5,100','apple_maple,3,60','choco_charlie,2,25','buzzysin,1,10'] 
for line in lines: 
    name, level, score = line.split(',') 
    print(name, 'is in level', level, 'with score', score) 

打印:

buzzysin is in level 5 with score 100 
apple_maple is in level 3 with score 60 
choco_charlie is in level 2 with score 25 
buzzysin is in level 1 with score 10 
+0

這不是我需要的格式,但'line.split(',')'似乎是我需要的。 – BUZZYSIN

+1

是的,我只是想表明分裂的作品。我通常只是回答這個問題,而不是寫一個完整的解決方案,並強迫他們:-) –

+0

哦,謝謝,Pochmann先生! – BUZZYSIN

0
# get all scoreboard data 
data = ['buzzysin,5,100','apple_maple,3,60','choco_charlie,2,25','buzzysin,1,10'] 
# get target name 
target_name = input("Enter a username: ") 
# initialize our target scoreboard 
target_scoreboard = {} 
# get scoreboard data for our target 
for name_data in data: # look at all the data, one item at a time 
    if name_data.split(',')[0] == target_name: 
     # if this data is for our target, add it to out target scoreboard 
     level = int(name_data.split(',')[1]) 
     score = int(name_data.split(',')[2]) 
     target_scoreboard[level] = score 

# print scoreboard for our target, sorted by level 
print("\tLevel\tScore") 
print("-"*25) 
for level in sorted(target_scoreboard): 
    print('\t{:d}\t{:d}'.format(level, target_scoreboard[level])) 
+0

對不起,打擾你,但我真的是新的python - 你可以把評論顯示每個主要部分做什麼? 謝謝 – BUZZYSIN

+0

當然,請參閱上文。 –

+0

非常感謝。 – BUZZYSIN

相關問題