2012-02-06 69 views
1

你好我想弄清楚如何通過多個變量對嵌套列表進行排序,而有些不會按1,2,3排序而是按預定列表排序。使用對象列表排序嵌套列表

例如:

List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]] 

這將導致:

[[XD,1],[XD,2],[XD,3],[XT,2],[X5,2],[X5,3]] 

第一元件將由sortbylist和數字順序簡單地在第二元件進行排序。

SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'} 

我當前已經嘗試使用代碼:

List.sort(key=SortByList.__getitem__ x: x[0]) 
List=sorted(List,key=itemgetter(1)) 

然而,這似乎並沒有工作。任何提示?

一個做到這一點的最簡單的方法是:

Result=sorted(List, key=lambda x:(SortByList[x[0]],x[1])) 

回答

3

如何:

In [2]: List=[['XD',1],['XD',3],['XD',2],['X5',2],['X5',3],['XT',2]] 

In [3]: SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'} 

In [4]: sorted(List, key=lambda x:(SortByList[x[0]],x[1])) 
Out[4]: [['XD', 1], ['XD', 2], ['XD', 3], ['XT', 2], ['X5', 2], ['X5', 3]] 

它使用在你的問題解釋兩元素化合物的關鍵。

+0

這在python中直接運行時效果很好。然而,當你把它放在一個程序裏面時,它似乎並沒有對列表進行排序。有任何想法嗎? – Daniel 2012-02-06 20:33:47

+0

@Ophion:這段代碼只是輸出結果;它不會將其分配回「List」。將其更改爲'List = sorted(List,key = ...)'或使用'List.sort(key = ...)'。 – NPE 2012-02-06 20:39:37

2

這裏的問題是,你正試圖使用​​他們的名字對對象進行排序來獲得排序順序,但是你的對象沒有任何引用他們的名字。除了在locals()globals()中搜索外,沒有辦法從您的對象XD中知道它被稱爲'XD'

這裏最好的選擇是將變量存儲在字典中,而不是直接存儲在作用域/名稱空間中。所以從這個更改代碼:

XD = MyObject(...) 
X5 = MyObject(...) 
XT = MyObject(...) 
List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]] 

要這樣:

XDict = {'XD': MyObject(...), 
     'X5': MyObject(...), 
     'XT': MyObject(...)} 
List = [[XDict['XD'],1],[XDict['XD'],3],[XDict['XD'],2], 
     [XDict['X5'],2],[XDict['X5'],3],[XDict['XT'],2]] 

List內容將是完全一樣的,但現在你有辦法的名稱'XD''X5'相關聯,'XT'與一個對象,所以當定義SortList時,你可以創建一個實際對象名稱的名稱:

SortByList=[XDict.get('XD'), XDict.get('XT'), XDict.get('XQ'), XDict.get('X5')] 
sorted(List, key=lambda k, i: (SortedByList.index(k), i)) 

通過這種方式,即使某些變量未定義,您也可以創建SortByList,如XQ將在此示例中。 SortByList中的那個條目只是None,當其他元素被排序時,這不會導致任何問題。

+0

我希望有一個更簡單的答案。如果aix的建議不起作用,我會使用它。謝謝你的反饋。 – Daniel 2012-02-06 20:34:28