li = [[{'foo': '1',
'date': datetime.date(2011, 2, 1),
'bar': 'a'},
{'foo': '2',
'date': datetime.date(2011, 2, 1),
'bar': 'b'}],
[{'foo': '2',
'date': datetime.date(2011, 1, 30),
'bar': 'f'},
{'foo': '5',
'date': datetime.date(2011, 1, 30),
'bar': 'g'}]]
我想将此列表转换为
[{'date':datetime.date(2011, 2, 1),
'values':[{'foo': '1', 'bar': 'a'},{'foo':'2','bar': 'b'}]},
{'date':datetime.date(2011, 1, 30),
'values':[{'foo': '2', 'bar':'f'},{'foo': '5','bar': 'g'}]}
]
答案 0 :(得分:2)
这样的东西?
dd = []
for l in li:
d = {'date':l[0]['date'], 'values':[]}
for ll in l:
d['values'].append({'foo':ll['foo'], 'bar':ll['bar']})
dd.append(d)
print dd
[{'date': datetime.date(2011, 2, 1),
'values': [{'bar': 'a', 'foo': '1'}, {'bar': 'b', 'foo': '2'}]},
{'date': datetime.date(2011, 1, 30),
'values': [{'bar': 'f', 'foo': '2'}, {'bar': 'g', 'foo': '5'}]}]
答案 1 :(得分:2)
我认为外部集合是一个词典更有意义:
from collections import defaultdict
from pprint import pprint
d = defaultdict(list)
for x in li:
for y in x:
d[y.pop('date')].append(y)
pprint(dict(d))
将产生:
{datetime.date(2011, 1, 30): [{'bar': 'f', 'foo': '2'},
{'bar': 'g', 'foo': '5'}],
datetime.date(2011, 2, 1): [{'bar': 'a', 'foo': '1'},
{'bar': 'b', 'foo': '2'}]}
但如果你想要那个名单,你可以坚持:
L = []
for date, values in d.iteritems():
L.append({'date':date, 'values':values})
pprint(L)
给出了:
[{'date': datetime.date(2011, 2, 1),
'values': [{'bar': 'a', 'foo': '1'}, {'bar': 'b', 'foo': '2'}]},
{'date': datetime.date(2011, 1, 30),
'values': [{'bar': 'f', 'foo': '2'}, {'bar': 'g', 'foo': '5'}]}]
答案 2 :(得分:0)
pop
的另一种用途,它减少了函数的大小:
>>> res = []
>>> for a_list in li:
res_local = {'values': []}
for d in a_list:
res_local['date'] = d.pop('date')
res_local['values'].append(d)
res.append(res_local)
>>> res
[{'date': datetime.date(2011, 2, 1),
'values': [{'foo': '1', 'bar': 'a'}, {'foo': '2', 'bar': 'b'}]},
{'date': datetime.date(2011, 1, 30),
'values': [{'foo': '2', 'bar': 'f'}, {'foo': '5', 'bar': 'g'}]}]
如果您的词组中的项目数量超过foo
,date
,bar
,或者您删除了一些项目等,则此解决方案的优势仍然有效:将其汇总如果您的dicts至少有一个date
条目,它将起作用。