2013-04-22 87 views
1

Jinja2中的sort filter有可能先後依次對一個列表進行排序,然後再由另一個屬性進行排序?這似乎是一件很自然的事情,但在我的測試中,前面的排序完全不穩定,所有的排序都丟失了。Jinja2中的穩定排序

我已經在python中先排序,然後再將列表傳遞給模板,但我想知道是否可以在Jinja2中對「stable」進行排序。

我應用濾波器的方法是,像這樣:

{{ item_list|sort(attribute='value')|sort(attribute='color') }} 

果然不出我所希望看到的是列表中color排序,共享由value排序的色彩元素。相反,它看起來好像從未發生過value

例如,從這個名單:

2 red 
3 blue 
3 red 
2 blue 
1 blue 
4 red 

我想是這樣的:

1 blue 
2 blue 
3 blue 
2 red 
3 red 
4 red 

我看着groupby過濾器,但該實現似乎過於複雜(將嵌套的for循環需要)。

+0

的Jinja2將列表傳遞給第一排序函數和排序'value'。然後將返回的列表傳遞給第二個排序函數,並再次按'color'排序。很明顯,這與僅僅通過'color'排序列表一樣好,所以第一類被'覆蓋' – RedBaron 2013-04-22 08:59:58

+0

@RedBaron我相信你錯過了,在這個例子中,你可以擁有共享顏色的元素,但是有不同的價值。我將添加一個示例輸出來澄清。 – ford 2013-04-22 09:05:41

回答

6

我不知道可以做到這一點的原生jinja2過濾器。要根據多個屬性對列表進行排序,您可以在jinja2中定義一個custom filter

從接受的答案this question,您可以編寫自己的過濾器

import operator 

def sort_multi(L,*operators): 
    L.sort(key=operator.itemgetter(*operators)) 
    return L 

註冊在你的應用環境。因此,對於pyramid,你會做這樣的事情

env = config.get_jinja2_environment() 
env.filters['sort_multi'] = sort_multi 

最後在模板

{{item_list|sort_multi('value','color')}} 
+0

這看起來像一個優雅的解決方案。我會嘗試它(在Flask中)並接受它是否有效。謝謝! – ford 2013-04-22 22:24:23

+0

剛剛過了我的頭頂。在sort()中傳遞一個元組到''attribute'是否工作? – RedBaron 2013-04-23 04:27:44

+0

仍然沒有機會測試這個,但看看[排序方法](http://docs.python.org/2/howto/sorting.html),我認爲不是。另外,我應該使用operator.attrgetter而不是itemgetter。 – ford 2013-04-23 17:06:58

相關問題