0

Djangoアプリでの作業。のリストがadsあり、テンプレートでこれらをフィルタリングできるようにしたいと考えています(たとえば、のすべての広告を取得してからspot_id = 1、ランダムな広告を選択します。

私はDjangoの不思議なクエリの代わりにカーソルを介して生のSQLを使用しているので、すでにリストを持っています(dictに変換されています)。これが私がこれまでに持っているものです:

# list/dict of ads
[
 {'filename': u'rc_ad_06_02_11.gif', 'spot_id': 1L }, 
 {'filename': u'k_banner.jpg', 'spot_id': 1L}, 
 {'filename': u'dwarves-banner.gif', 'spot_id': 1L}, 
 {'filename': u'k_skyscraper.jpg', 'spot_id': 2L }
]   

# attempt to group them somehow
final_ads = []

    last_spot_id = 0
    for a in ads:
        if a['spot_id'] != last_spot_id:
        final_ads[a['spot_id']][] = a # syntax error here
    last_spot_id = a['spot_id']

logger.info(final_ads)

これは機能しません。私が本質的に到達しようとしているのは、この種の構造のリストです。

[
 1: [
     {'filename': u'rc_ad_06_02_11.gif', 'spot_id': 1L }, 
     {'filename': u'k_banner.jpg', 'spot_id': 1L}, 
     {'filename': u'dwarves-banner.gif', 'spot_id': 1L}
 ],
 2: [
     {'filename': u'k_skyscraper.jpg', 'spot_id': 2L }
 ]
]   

(これを表現する適切な方法を考えることができませんでした、それが正しく見えない場合は申し訳ありません)。

誰かがこれを行うためのより賢い方法を私に示すことができれば、私は非常に感謝するでしょう。ありがとう。

4

4 に答える 4

2

defaultdictはこれをうまく処理する必要があり、リストではなくdictを返します

final_adsは、{1:[a1、a3、a4]、2:[a2、a5]...}のようになります。

from collections import defaultdict
final_ads = defaultdict(list)
for a in ads:
    final_ads[a['spot_id']].append(a)

print final_ads
for spot_id in sorted(final_ads.keys()):
    print "Spot %s=%s"%(spot_id,final_ads[spot_id])

dictのリストを含む上記のコードはプリントを返します

defaultdict(<type 'list'>, {1L: [{'spot_id': 1L, 'filename': u'rc_ad_06_02_11.gif'}, {'spot_id': 1L, 'filename': u'k_banner.jpg'}, {'spot_id': 1L, 'filename': u'dwarves-banner.gif'}], 2L: [{'spot_id': 2L, 'filename': u'k_skyscraper.jpg'}]})
Spot 1=[{'spot_id': 1L, 'filename': u'rc_ad_06_02_11.gif'}, {'spot_id': 1L, 'filename': u'k_banner.jpg'}, {'spot_id': 1L, 'filename': u'dwarves-banner.gif'}]
Spot 2=[{'spot_id': 2L, 'filename': u'k_skyscraper.jpg'}]
于 2012-08-09T21:12:07.927 に答える
1
import collections
final_ads = collections.defaultdict(list)
for ad in ads:
    final_ads[ad['spot_id']].append(ad)
logger.info(final_ads)
于 2012-08-09T21:15:06.610 に答える
1

このスクリプトはあなたが探しているものだと思います。

final_ads = {}
for a in ads:
    final_ads.setdefault(a['spot_id'], []).append(a)

setdefaultリストが存在しない場合は、リストを初期化することに注意してください。

于 2012-08-09T21:13:03.563 に答える
1
import itertools
grps = itertools.groupby(ads,lambda x:x['spot_id'])
final_ads = dict(map(lambda (k,g):(k,list(g)),grps)
于 2012-08-09T21:27:38.760 に答える