将下面的数据可以通过’model’字段进行group by
SOME_DATA = [ {'model': u'Yaris', 'some_value': 11202, 'trim_name': u'3-Door L Manual'}, {'model': u'Yaris', 'some_value': 19269, 'trim_name': u'3-Door LE Automatic'}, {'model': u'Corolla', 'some_value': 27119, 'trim_name': u'L Automatic'}, {'model': u'Corolla', 'some_value': 32262, 'trim_name': u'LE'}, {'model': u'Corolla', 'some_value': 37976, 'trim_name': u'S Premium'}, {'model': u'Camry', 'some_value': 39730, 'trim_name': u'LE 4-Cyl'}, {'model': u'Camry', 'some_value': 45761, 'trim_name': u'XSE 4-Cyl'}, {'model': u'Yaris', 'some_value': 48412, 'trim_name': u'3-Door L Automatic'}, {'model': u'Camry', 'some_value': 55423, 'trim_name': u'XLE 4-Cyl'}, {'model': u'Corolla', 'some_value': 57055, 'trim_name': u'ECO Premium'}, {'model': u'Corolla', 'some_value': 61296, 'trim_name': u'ECO Plus'}, {'model': u'Camry', 'some_value': 63660, 'trim_name': u'XSE V6'}, {'model': u'Yaris', 'some_value': 65570, 'trim_name': u'5-Door LE Automatic'}, {'model': u'Camry', 'some_value': 67461, 'trim_name': u'XLE V6'}, {'model': u'Corolla', 'some_value': 73602, 'trim_name': u'S'}, {'model': u'Yaris', 'some_value': 74158, 'trim_name': u'5-Door SE Manual'}, {'model': u'Corolla', 'some_value': 74249, 'trim_name': u'LE Plus'}, {'model': u'Corolla', 'some_value': 78386, 'trim_name': u'ECO'}, {'model': u'Camry', 'some_value': 82747, 'trim_name': u'SE 4-Cyl'}, {'model': u'Corolla', 'some_value': 83162, 'trim_name': u'LE Premium'}, {'model': u'Corolla', 'some_value': 84863, 'trim_name': u'S Plus Manual'}, {'model': u'Yaris', 'some_value': 90313, 'trim_name': u'5-Door L Automatic'}, {'model': u'Corolla', 'some_value': 90452, 'trim_name': u'L Manual'}, {'model': u'Yaris', 'some_value': 93152, 'trim_name': u'5-Door SE Automatic'}, {'model': u'Corolla', 'some_value': 94973, 'trim_name': u'S Plus CVT'}, ]
可以通过collection库中的defaultdict来实现
import collections grouped = collections.defaultdict(list) for item in SOME_DATA: grouped[item['model']].append(item) for model, group in grouped.items(): print print model pprint(group, width=150)
也可以使用itertools.groupby,这种方式可能是更好的,因为对于比较大的数据集,group by会返回一个迭代器,这也是为什么我打印之前先转为了list
import itertools def keyfunc(x): return x['model'] SOME_DATA = sorted(SOME_DATA, key=keyfunc) for model, group in itertools.groupby(SOME_DATA, keyfunc): print print model pprint(list(group), width=150)
下面是运行的结果
Camry [{'model': u'Camry', 'some_value': 36776, 'trim_name': u'SE 4-Cyl'}, {'model': u'Camry', 'some_value': 56569, 'trim_name': u'LE 4-Cyl'}, {'model': u'Camry', 'some_value': 57052, 'trim_name': u'XSE 4-Cyl'}, {'model': u'Camry', 'some_value': 92360, 'trim_name': u'XLE V6'}, {'model': u'Camry', 'some_value': 92756, 'trim_name': u'XSE V6'}, {'model': u'Camry', 'some_value': 94413, 'trim_name': u'XLE 4-Cyl'}] Corolla [{'model': u'Corolla', 'some_value': 13307, 'trim_name': u'L Automatic'}, {'model': u'Corolla', 'some_value': 15726, 'trim_name': u'ECO Plus'}, {'model': u'Corolla', 'some_value': 25579, 'trim_name': u'S'}, {'model': u'Corolla', 'some_value': 31920, 'trim_name': u'ECO Premium'}, {'model': u'Corolla', 'some_value': 34480, 'trim_name': u'LE'}, {'model': u'Corolla', 'some_value': 44958, 'trim_name': u'S Plus Manual'}, {'model': u'Corolla', 'some_value': 49606, 'trim_name': u'LE Premium'}, {'model': u'Corolla', 'some_value': 59629, 'trim_name': u'LE Plus'}, {'model': u'Corolla', 'some_value': 74226, 'trim_name': u'S Plus CVT'}, {'model': u'Corolla', 'some_value': 75725, 'trim_name': u'L Manual'}, {'model': u'Corolla', 'some_value': 82382, 'trim_name': u'ECO'}, {'model': u'Corolla', 'some_value': 95633, 'trim_name': u'S Premium'}] Yaris [{'model': u'Yaris', 'some_value': 16789, 'trim_name': u'3-Door L Manual'}, {'model': u'Yaris', 'some_value': 20349, 'trim_name': u'5-Door LE Automatic'}, {'model': u'Yaris', 'some_value': 42897, 'trim_name': u'5-Door L Automatic'}, {'model': u'Yaris', 'some_value': 62045, 'trim_name': u'5-Door SE Automatic'}, {'model': u'Yaris', 'some_value': 91913, 'trim_name': u'3-Door L Automatic'}, {'model': u'Yaris', 'some_value': 94218, 'trim_name': u'5-Door SE Manual'}, {'model': u'Yaris', 'some_value': 97979, 'trim_name': u'3-Door LE Automatic'}]
说点什么
欢迎讨论