2012-08-09 27 views
0

使用Django应用程序。我有一个列表ads,我希望能够过滤这些模板(例如,抓住spot_id = 1的所有广告,然后选择一个随机的Python:如何按类别对这个项目列表进行分组?

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

# 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 } 
] 
] 

(想不到合适的代表这种方式,抱歉,如果它看起来不正确)。

如果任何人都可以告诉我一个更明智的做法,我会非常感激。谢谢。

回答

1

我觉得这个剧本是你在找什么。

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

setdefault如果不存在的话初始化列表。

+0

很多好的答案在这里,但接受这一个,因为它是最接近我的精神是什么试图去做(关于'setdefault'的很好的提示,正在努力如何动态实现这一点)。 – 2012-08-09 21:40:31

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

上面的代码与你的类型的字典列表返回打印

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'}] 
+0

是否与'long'如'1L'处理好? – 2012-08-09 21:14:29

+0

确定其字典... 1L可能会下降到1 ...(或没有看到上述结果..仍然1L) – 2012-08-09 21:15:38

1
import collections 
final_ads = collections.defaultdict(list) 
for ad in ads: 
    final_ads[ad['spot_id']].append(ad) 
logger.info(final_ads) 
1
import itertools 
grps = itertools.groupby(ads,lambda x:x['spot_id']) 
final_ads = dict(map(lambda (k,g):(k,list(g)),grps) 
相关问题