2011-03-14 203 views
2

我試圖將問題的答案移植到Django的How to sort alpha numeric set in python中。我有一個由查詢返回的Django模型實例的列表,我無法弄清楚如何使用lambda來構造一個優雅的(或其他!)排序函數。如何對Django模型對象的字母數字列表進行排序

如果我的模型包含'name'屬性 - 例如

result = Take.objects.all() 
for i in result: 
    print i.name 

如何使用name屬性對結果列表進行排序並應用大量測試?

即我的名字的值可以是 '1A', '1', 'A1', '001A' 等

例如 給這個排序(基於名稱)

1A 
2A 
10A 
A1 
A2 
A10 
A11 
B2 
B4 

回答

5

使用operator.attrgetter通過屬性的價值,你的對象進行排序:

import operator 

class Foo: 
    def __init__(self, name): 
     self.name = name 

l = [Foo('AA'), Foo('a'), Foo('AB')] 
l.sort(key=operator.attrgetter('name')) 
print [o.name for o in l] 
['AA', 'AB', 'a'] 

這裏是我提供which defines a function進行字母數字排序另一個答案按照「人」的順序。合併_human_key功能到上面的例子,你可以這樣做:

l.sort(key=lambda x: _human_key(x.name)) 
print [o.name for o in l] 
['a', 'AA', 'AB'] 
0

試試這個:

result = Take.objects.order_by('name') 
for x in result: 
    print x 

然而,例如命令你提到的是不是一個正常的字母(字典)排序,因爲我知道它。相反,它會是:

10A 
1A 
2A 
A1 
A10 
A11 
A2 
B2 
B4 

如果您確實需要您指定的順序,則必須獲得更多的創造性。

+3

如果我有聲望,我會將其標記下來。是的,我真的想要我指定的訂單... – michela 2011-03-15 07:32:44

+0

您的答案表明非常簡單的解決方案,完全是另一個問題。 – rslnx 2014-07-25 15:43:49

相關問題