0

使用 Django 应用程序。我有一个列表,ads我希望能够在模板中过滤这些(例如,抓取 的所有广告spot_id = 1,然后随机选择一个。

我通过游标使用原始 SQL 而不是 Django 的神秘查询,所以我已经有了我的列表(转换为字典)。这是我到目前为止所拥有的:

# 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 应该可以很好地处理它,它将返回一个字典而不是一个列表

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])

上面的代码与您的 dicts 列表返回打印

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 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 回答
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 回答