2014-02-21 49 views
0

我計算學生誰張貼a question here the other day about helping me with my function to sort scores in order和我得到了一些很大的幫助,現在的作品,但我也希望它的名字根據分數(排序,以便如果詹姆斯得到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 

那麼你應該得到整理兩份名單,只要你想他們。

唯一的時候,這將導致一個錯誤是,如果你的兩個列表的長度不同。如果namelist在某種程度上比scorelist短,那麼這段代碼會拋出異常。您可以防止通過您的排序程序之前檢查

len(scorelist) == len(namelist) 
0

試想一下,你有一個如返回一個排序列表功能這裏的Quicksort algorithm在Python實現:

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

qsorted_scorelist = qsorted(scorelist) 

要根據scorelist順序排序namelist;你可以使用Schwartzian transform

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

注意,相同功能qsorted()兩種情況下使用:排序沿着scorelist和兩份名單一起排序。您應該嘗試將常用功能提取到單獨的函數中,而不是修改您的排序算法,以完成輕微不同的任務。

要測試的結果是正確的;你可以使用內置的sorted()功能:

sorted_namelist = [name for score, name in sorted(zip(scorelist, namelist))]