2010-01-16 100 views
2

我正在尋找做好以下更Python的方式通知內的字典值(按鍵)來排序對象的列表。Python的方式通過包含對象

考慮:

class MyObj(object): 
    def __init__(self): 
     self.dict_properties = {} 

假設我有一個包含多個MyObj中實例的列表:

mylist = [<__main__.MyObj object at 0x1005e3b90, ...] 

現在我想根據某些關鍵的dict_properties在價值排序mylist MyObj中。

什麼工作是:

mylist.sort(lambda x,y: cmp(x.dict_properties['mykey'], 
          y.dict_properties['mykey'])) 

幾乎感覺Python的

有沒有更好的方法(可能使用operator.attrgetter)?

+0

標籤不上問的人的水平的反映。沒有人聲稱你是初學者Christophe,但是在任何一天,至少有幾個問題要求**與你的**完全相同,因爲答案可以很容易地在文檔中找到,因此是一個需要標記[新手]的問題。請停止移除此標記。謝謝。 – SilentGhost 2010-01-18 12:44:39

+0

如果你懷疑我對頻率或重複的要求請查看:http://stackoverflow.com/questions/tagged/python+sorting – SilentGhost 2010-01-18 12:48:11

+0

我就需要在這個問題上「初學者」標記了不同意見:不像大多數這種類型的其他問題,我提供了一個工作方式來做到這一點,然後特別要求以更「pythonic」的方式做到這一點的替代/其他方式。似乎答案是顯而易見的(答案中只有一種方法),儘管我沒有立即想到這應該是最乾淨的方式=。但是我只會留下標籤,因爲我對(進一步)回滾/編輯戰爭沒有興趣。 – ChristopheD 2010-01-18 19:45:32

回答

9
mylist.sort(key=lambda x: x.dict_properties['mykey']) 

是方式更簡單,更快。您可以達到operator並嘗試撰寫attrgetteritemgetter,但在這裏看起來最簡單的lambda(或def)似乎最簡單。

+0

非常感謝。似乎這確實是一種提供此功能的非常乾淨的方式;-) – ChristopheD 2010-01-16 21:47:43

+0

只有負面的觀點是,這在Python 2.4下不起作用,不是嗎? (儘管我懷疑這個版本下面還有很多python安裝)。 – ChristopheD 2010-01-16 21:50:59

+1

@ChristopheD,yep,'key ='是在2中引入的。4(最終發佈時間比5年前多一點)。任何需要支持6歲或以上版本的人無疑都應該明確提及這一事實,我想;-)。 – 2010-01-16 23:14:27

3

我只是做:

mylist.sort(key=lambda o: o.dict_properties["kykey"])

你也可以在此改變的類CMP

+0

非常感謝。我認爲課堂上壓倒了cmp,但這意味着失去了一些可變選擇「mykey」的動力(除非我錯了) – ChristopheD 2010-01-16 21:47:02

1

如果速度是一個問題,然後用裝飾排序 - 去除裝飾:

mylist_decorated = [(elem.dict_properties['mykey'], elem) for elem in mylist] 
    mylist_decorated.sort() 
    mylist = [elem[1] for elem in mylist_decorated] # or zip(*mylist_decorated)[1] :) 
  • 這樣的sort()可以展翅高飛。
+1

這幾乎是排序方法的關鍵參數爲你做的。如果你使用Python <2.4,那麼這將是一個明智的方式來做到這一點,否則你只是爲自己做工。 – 2010-01-17 00:34:46

+0

在這裏,你得到了我!謝謝你的提示。 – 2010-01-17 10:52:19