List元素合并到dict

David Wong提问

David Wong yydavid.wong@gmail.com
发件人当地时间:         发送时间 15:06 (GMT+08:00)。发送地当前时间:下午2:15。 ✆
主题:      [CPyUG] 上来求一个dict合并的优雅一点的方法

有这样一个list

Toggle line numbers
   1 qrs = [{'type': 'a', 'data': 'hello'}, 
   2      {'type': 'b', 'data': 'hello1'}, 
   3      {'type': 'b', 'data': 'hello2'}, 
   4      {'type': 'b', 'data': 'hello3'}, 
   5      {'type': 'a', 'data': 'hello4'}, 
   6      {'type': 'a', 'data': 'hello5'}, 
   7      {'type': 'b', 'data': 'hello6'}, 
   8      {'type': 'b', 'data': 'hello7'}, ]
   9 
  10 #想得到合并后的结果
  11 
  12 result = [{'type': 'a', 'data': ['hello', 'hello4', 'hello5']}, 
  13              {'type': 'b', 'data': ['hello1', 'hello2', 'hello3', 'hello6', 'hello7']}, ]

自己写了一段c样式代码实现了,但觉得很不优雅,很丑陋。 所以问问各位有什么更优雅更Pythonic的方法实现

WooParadog:itertools

WooParadog guohaochuan@gmail.com
发件人当地时间:         发送时间 17:09 (GMT+08:00)。发送地当前时间:下午2:14。 ✆

Toggle line numbers
   1 if __name__ == '__main__':
   2     qrs = [{'type': 'a', 'data': 'hello'}, 
   3         {'type': 'b', 'data': 'hello1'}, 
   4         {'type': 'b', 'data': 'hello2'}, 
   5         {'type': 'b', 'data': 'hello3'}, 
   6         {'type': 'a', 'data': 'hello4'}, 
   7         {'type': 'a', 'data': 'hello5'}, 
   8         {'type': 'b', 'data': 'hello6'}, 
   9         {'type': 'b', 'data': 'hello7'}, 
  10         ]
  11 
  12     import itertools
  13     import operator
  14 
  15     li=[]
  16     qrs.sort(key=operator.itemgetter('type'))
  17     for k,g in itertools.groupby(qrs,key=operator.itemgetter('type')):
  18         dic.append({'type':k,'data':[i['data'] for i in g]})
  19     print li

Leo Jay:collections

Leo Jay python.leojay@gmail.com
发件人当地时间:         发送时间 11:30 (GMT+08:00)。发送地当前时间:下午2:12。 ✆

Toggle line numbers
   1 from collections import defaultdict
   2 
   3 d = defaultdict(list)
   4 [d[q['type']].append(q['data']) for q in qrs]
   5 result = [{'type': k, 'data': v} for k, v in d.items()]
   6 print result

sunshine:setdefault()

sunshine zy.netsec@gmail.com
发件人当地时间:         发送时间 12:43 (GMT+08:00)。发送地当前时间:下午2:10。 ✆

Toggle line numbers
   1 new_list = {}
   2 
   3 for elem in qrs:
   4     new_list.setdefault(elem['type'], []).append(elem['data'])
   5     
   6 print new_list


反馈

创建 by -- ZoomQuiet [2011-11-28 06:17:33]