2011-04-29 2 views
2

나는이 게임을 쓰고 있으며, 높은 점수 목록을 코딩하는 데 어려움이 있습니다.* 파이썬 코드 * 문제/.txt 파일 및 튜플 + 사전 포함

높은 점수 테이블은 Name, Score가 순서대로 나열되는 .txt 파일로 구성되며, 각 파일은 테스트를 위해 현재 새 줄에 있습니다. 오른쪽

def showScores(): 
    inFile = open("scores.txt", 'r') 
    scorelist = {} 
    for line in inFile: 
     line = line.strip() 
     parts = [p.strip() for p in line.split(",")] 
     scorelist[parts[0]] = (parts[1]) 
    players = scorelist.keys() 
    players.sort() 
    print "High Scores:" 
    for person in players: 
     print person, scorelist[person] 
     inFile.close() 

내가 바로를 정렬하는 방법을 모른다 :

print "You got it!\nWell done", NAME,",You guessed it in", count, "guesses." 
save = raw_input("\nWould you like to save your score? (Y)es or (N)o: ") 
save = save.upper() 
if save == "Y": 
    inFile = open("scores.txt", 'a') 
    inFile.write("\n" + NAME + ", " + str(count)) 
    inFile.close() 
    count = -1 
if save == "N": 
    count = -1 

및 점수를 표시하는 내 코드는 다음과 같습니다

Matthew, 13 
Luke, 6 
John, 3 

점수를 기록하는 내 코드입니다 이제는 알파벳 순서에 따라 정렬합니다.하지만 가장 작은 순서에서 가장 큰 순서로 정렬하고 싶지만 NAME의 형식은 그대로 유지하십시오.

또한 때마다, 나는이 .txt

Matthew, 13 
Luke, 6 
John, 3 
Mark, 8 
Mark, 1 

에서

... 그것을 저장하는 같은 이름의 새로운 높은 점수를 저장하려고하지만 같은 가장 최근의 점수를 보여줍니다 이름은 파이썬 쉘에서

High Scores: 
John 3 
Luke 6 
Mark 1 
Matthew 13 

또는 단지는 동일의 한 인스턴스를 보여줍니다 그것을 안에, 나는 짐작한다. 누군가는 그것을 고치는 방법을 알고 있는가? 사전

답변

2

가 정렬 및 하나의 이름에 대한 다수의 점수를 모두 해결하려면 튜플의 목록을 저장 더 나을 것 데이터 구조. 플레이어의 이름, 점수 다음 :이 튜플이 두 요소를 포함하는 대신 사전의 튜플의 목록을 사용

def showScores(): 
    inFile = open("scores.txt", 'r') 
    scorelist = [] 
    for line in inFile: 
     line = line.strip() 
     score = [p.strip() for p in line.split(",")] 
     score[1] = int(score[1]) 
     scorelist.append(tuple(score)) 
    scorelist.sort(key=lambda x: x[1]) 
    print "High Scores:" 
    for score in scorelist: 
     print score[0], score[1] 
    inFile.close() 

: 여기 디스플레이 코드를 작성하는 것이 방법입니다.

추가 메모 : NAME에 쉼표 또는 개행 문자가 포함되지 않도록하여 점수 파일이 손상되지 않도록해야합니다.

+0

+1,'int' 로의 변환과 이름에 관한 요지. – senderle

+0

추가 조언을 주셔서 감사합니다. :) – Jerry

3

에서

덕분에, 점수가 아닌 이름으로 정렬하려면 key 키워드 인수를 사용합니다.

players.sort(key=lambda x: int(scorelist[x])) 

두 번째 질문 (제 생각에는?)에 대답하려면 사전을 사용하여 점수를 저장하십시오. 따라서 주어진 이름은 한 번에 하나의 점수 만 저장할 수 있습니다.

parts = [p.strip() for p in line.split(",")] 
scorelist[parts[0]] = (parts[1]) #second Mark score overwrites first Mark score 

여러 점수를 저장하려면 단일 int 대신 점수 목록을 저장하십시오. (당신이 포장을 풀고 사용하는 경우 또한, 당신의 코드가 더 읽을 수 있습니다.) 물론

name, score = [p.strip() for p in line.split(",")] 
if name not in scorelist: 
    scorelist[name] = [] 
scorelist[name].append(score) 

를이 방법으로 그것을 할 경우, 점수에 의해 정렬하는 것은 더 복잡해진다. 당신 같은 사람이 여러 개의 점수를 저장할 때문에, 당신은, 당신은 아마 당신을 변경하려면

def showScores(): 
    inFile = open("scores.txt", 'r') 
    scorelist = [] 
    for line in inFile: 
     line = line.strip() 
     namescore = tuple(p.strip() for p in line.split(",")) 
     scorelist.append(namescore) 
    scorelist.sort(key=lambda namescore: int(namescore[1])) 
    print "High Scores:" 
    for name, score in scorelist: 
     print name, score 
    inFile.close() 
+0

도움을 주셔서 감사합니다! 저는 Fundamentals of Python 텍스트 북을 공부해 왔으며 언팩과 람다를 결코 이해하지 못했습니다. 당신은 신속한 대답과 쉬운 코드를 가지고있었습니다. – Jerry

+0

문제 없음 - Aaron은 좋은 점을 가지고 있습니다. 정렬을 위해 점수를 int로 변환하는 것을 잊었습니다. 나는 그것을 편집했다. 또한 쉼표가없는 이름에 대한 요지를 참조하십시오. – senderle