Как я могу перебрать подгруппы OrderedDict в ZPT?
У меня есть метод просмотра в браузере, который возвращает OrderedDict, содержащий не более 18 мозгов, созданный что-то похожее на это:
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 будут мозгами.
Кстати, если бы у меня был список вместо dict, я мог бы перегруппировать его элементы:
zip(*[mylist[i::3] for i in range(3)])
Но это невозможно для диктовок и (как ни странно) для OrderedDicts.
1 ответ
Решение
Я думаю, что это то, что вы действительно хотите
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')])]