2

私は、次のようなものから発生した、最大 18 個の頭脳を含む 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}例: thisを thisに変換したいと思い[{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)])

しかし、それはdictsでは不可能であり、(奇妙なことにimo)OrderedDictsでも不可能です。

4

1 に答える 1

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')])]
于 2014-02-24T20:25:28.813 に答える