2016-11-09 50 views
1

我已經設置了一個任務,通過像這樣的函數參數對給定的元組列表進行排序。我必須讓函數只用兩行代碼來操作。 排序順序是這樣: 1)級 2)姓 3)用的名字如何通過數字(降序)和按字母順序對元組的相同索引進行排序? [Python]

因此,例如,一個文檔測試將是:

sortStudents([('Tim Smith', 54), ('Anna Smith', 88), ('Barry Thomas', 88)]) 

這是我到目前爲止有:

def sortStudents(a): 
    return (sorted(a, key=lambda x: (-x[1], x[0].split()[1], x[0].split()[0]))) 

我已經完成了這些測試。然而,我無法通過的最後一個文檔測試是使用按字母順序排列的文檔,而不是數字文檔。而當我按降序排列數值(按索引)時,它會同時顛倒按字母排序的排序。 doctest的一個例子是:

sortStudents([('Tim Jones', 'C'), ('Anna Smith', 'B'), ('Barry Thomas', 'A')]) 

在此先感謝。

+0

你確實知道等級只是一個字母嗎? –

+0

在這個任務中是的。 –

+0

@MorganThrapp你還在誤解它,你提到的帖子是關於不同索引的討論,我說的是元組的相同索引,但是參數類型不同。 –

回答

0

您需要檢查等級(字符串或整數),以確定如何排序要做到:

def sortStudents(a): 
    return sorted(a, key=lambda x: [-x[1] if isinstance(x[1], int) else x[1]] 
            + x[0].split()[::-1]) 

你也可以將名字分裂一次,扭轉名單,而不是分裂兩次。

+0

[已回答]非常感謝,我認爲這是沿着類型問題的線索! –

+0

小心謹慎,如果列表中包含混合類型,那麼這將在Python 3上拋出異常,因爲在3個字符串中並且不可比較。在Python 2中,它將按照該名稱的所有字符串等級將所有數字等級分組。這可能是期望的行爲。 –

-2

你可以嘗試:

def sortStudents(a): 
    return (sorted(a, key=lambda x: (-int(str(x[1]).replace("A","90").replace("B","80").replace("C","70")), x[0].split()[1], x[0].split()[0]))) 

好像有點傻的鍛鍊,但這種做什麼,你需要做的,我想。

>>> a = [('Tim Smith', 54), ('Anna Smith', 88), ('Barry Thomas', 88)] 
>>> b=[('Tim Jones', 'C'), ('Anna Smith', 'B'), ('Barry Thomas', 'A')] 
>>> sortStudents(a) 
[('Anna Smith', 88), ('Barry Thomas', 88), ('Tim Smith', 54)] 
>>> sortStudents(b) 
[('Barry Thomas', 'A'), ('Anna Smith', 'B'), ('Tim Jones', 'C')] 
+0

對不起,我沒有解釋清楚,這兩行應該包括定義和正文。所以正好有一行代碼爲函數體本身。 –

+0

這是非常單一的。你爲什麼使用'try/except'來做這件事?特別是抓住所有'除了'。 –

+0

@MorganThrapp,我同意,但如果你問一個愚蠢的問題,你應該期待一個愚蠢的答案! –

相關問題