2014-02-24 42 views
2

我有返回包含至多18周的大腦的OrderedDict,發起的類似的東西,以這個瀏覽器視圖的方法:我如何循環ZPT中OrderedDict的子組?

mydict = OrderedDict() 
for b in brains: 
    video_obj = b.getObject() 
    mydict[b] = {'video_id': video_obj.url, 
       'thumb': video_obj.tag(scale='thumb')} 
return mydict 

我可以通過他們容易地循環產生一個平坦UL > LI列表中ZPT:

<ul> 
    <li tal:repeat="brain mydict"> 
    <a tal:attributes="href python:mydict[brain]['video_id']"> 
     <img tal:replace="mydict[brain]['thumb']" /> 
    </a> 
    </li> 
</ul> 

但我要的是一個批處理狀結構:

<ul> 
    <li> 
    <a>Item 1</a> 
    <a>Item 2</a> 
    <a>Item 3</a> 
    </li> 
    ... 
    <li> 
    <a>Item 16</a> 
    <a>Item 17</a> 
    <a>Item 18</a> 
    </li> 
</ul> 

如:我想改變這個{1:2, 2:4, 3:6, 4:8, 5:10, 6:12, 7:14, 8:16, 9:18}分成這個[{1:2, 2:4, 3:6}, {4:8, 5:10, 6:12}, {7:14, 8:16, 9:18}]

我不想更改瀏覽器視圖,因爲模板的其他部分需要mydict的鍵才能成爲大腦。

順便說一句,如果我有一個列表,而不是一個字典的,我可以重組它的元素搭配:

zip(*[mylist[i::3] for i in range(3)]) 

但是,這不可能類型的字典和(奇怪的是IMO)不OrderedDicts無論是。

+1

你的意思是你想批量通過3S的項目給他們組? –

+0

@ martijn-pieters是的,我想批量他們。此外,我更新了我的問題中的第一個片段,以反映OrderedDict的有效用法。 –

+1

您是否嘗試過拉鍊(* [mydict.values()[i :: 3],我在範圍內(3)]) – avoinea

回答

4

我認爲這是你你真正想要的:

from collections import OrderedDict 

mydict = OrderedDict() 

for i in xrange(18, 0, -1): 
    mydict['d{0}'.format(i)] = 'item {0}'.format(i) 

regroupped_dict = [OrderedDict(mydict.items()[i: i + 2]) 
        for i in xrange(0, len(mydict), 3)] 

print regroupped_dict 

# Result: [OrderedDict([('d18', 'item 18'), ('d17', 'item 17')]), OrderedDict([('d15', 'item 15'), ('d14', 'item 14')]), OrderedDict([('d12', 'item 12'), ('d11', 'item 11')]), OrderedDict([('d9', 'item 9'), ('d8', 'item 8')]), OrderedDict([('d6', 'item 6'), ('d5', 'item 5')]), OrderedDict([('d3', 'item 3'), ('d2', 'item 2')])]