2014-02-21 3 views
0

나는 컴퓨터를 사용하여 a question here the other day about helping me with my function to sort scores in order을 게시했으며 큰 도움을 받았지만 이제는 작동하지만 점수에 따라 이름을 정렬하고 싶습니다. (James가 10을 얻는다면 .. 인쇄 "제임스 (10)는"지금 무슨 일이 일어나고하면 점수 정렬하고 적절하게 화면에 인쇄하지만 이름은 단지 그들이 입력되는 순서로 인쇄되어 있다는 것입니다 나는이 시도했다 :정렬 이름 및 점수

def sortlist(): 
global scorelist, namelist, hss 
namelist = [] 
scorelist = [] 
hs = open("hstname.txt", "r") 
namelist = hs.read().splitlines() 
hss = open("hstscore.txt","r") 
for line in hss: 
    scorelist.append(int(line)) 

switched = True 
while switched: 
    switched = False 
    for i in range(len(scorelist)-1): 
     for j in range(len(namelist)-1): 
      if scorelist[i] < scorelist[i+1]: 
       scorelist[i],scorelist[i+1] = scorelist[i+1],scorelist[i] 
       namelist[j],namelist[j+1] = namelist[j+1],namelist[j] 
       switched = True 

점수 부분을 잘 작동하고 그것을 얻으려면 나이가 걸렸습니다 및 .sort() 같은 미리 정의 된 함수를 사용할 수 없습니다. 사람이 어떤 도움/조언을 제공 할 수 있습니까? 또는 내가 뭘 잘못하고 있는지 볼 수 있다면 그런 다음 해결책을 제시 할 수 있습니까? 저의 삶을 위해 이것을 해결할 수는 없습니다.

+0

2 개의 목록이 필요합니까, 아니면 하나로 결합 할 수 있습니까? – IanAuld

+0

@IanAuld 원래 하나의 목록이 있었지만이 프로젝트의 과정을 통해 나는 두 개의 목록으로 만들었고 이해할 수 있고 너무 많은 것을 바꾸기에는 너무 늦었습니다. – user3333868

답변

0

두 목록을 모두 통과하려면 중첩 루프를 사용할 필요가 없습니다.

정확히 같은 방식으로 두 목록을 조작해야하므로 하나의 for 루프 만 사용하고 i 변수를 사용하여 두 목록에 색인을 생성해야합니다.

전년 동기 대비 턴이 경우이에

for i in range(len(scorelist)-1): 
     for j in range(len(namelist)-1): 
      if scorelist[i] < scorelist[i+1]: 
       scorelist[i],scorelist[i+1] = scorelist[i+1],scorelist[i] 
       namelist[j],namelist[j+1] = namelist[j+1],namelist[j] 
       switched = True 

가 : 당신이 그들을 원하는

for i in range(len(scorelist)-1): 
     if scorelist[i] < scorelist[i+1]: 
      scorelist[i],scorelist[i+1] = scorelist[i+1],scorelist[i] 
      namelist[i],namelist[i+1] = namelist[i+1],namelist[i] 
      switched = True 

는 다음 정렬 두 목록을 얻어야한다.

두 개의 목록의 길이가 다른 경우에만 오류가 발생할 수 있습니다. namelistscorelist보다 다소 짧으면이 코드는 예외를 throw합니다. 당신은 당신의 정렬 루틴 이전에 그것을 체크함으로써이를 막을 수 있습니다.

len(scorelist) == len(namelist) 
0

예를 들어, 당신은 하나의 정렬 된리스트를 반환하는 함수를 가지고 있다고 상상해보십시오.

def qsorted(L): 
    return L and (qsorted([x for x in L[1:] if x < L[0]]) + # lesser items 
        [L[0]] +         # pivot 
        qsorted([x for x in L[1:] if x >= L[0]])) # greater or equal 

그런 다음 당신은 당신의 scorelist 정렬을 사용할 수 있습니다 : 여기 파이썬에서 Quicksort algorithm의 구현입니다

qsorted_scorelist = qsorted(scorelist) 

scorelist의 순서에 따라 namelist 정렬하려면이; 당신은 Schwartzian transform을 사용할 수 있습니다 따라 scorelist을 정렬과 함께 두 목록을 정렬하려면 다음 같은 기능 qsorted() 두 경우에 사용되는

qsorted_namelist = [name for score, name in qsorted(zip(scorelist, namelist))] 

참고. 사소한 다른 작업을 위해 정렬 알고리즘을 수정하는 대신 일반 기능을 별도의 함수로 추출해야합니다.

결과가 올바른지 테스트하려면 다음을 수행하십시오. 당신은 sorted() 내장 함수를 사용할 수 있습니다 :

sorted_namelist = [name for score, name in sorted(zip(scorelist, namelist))] 
관련 문제