如何将字典列表转换为....?

时间:2011-02-03 08:31:34

标签: python list

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

3 个答案:

答案 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'}]}]

如果您的词组中的项目数量超过foodatebar,或者您删除了一些项目等,则此解决方案的优势仍然有效:将其汇总如果您的dicts至少有一个date条目,它将起作用。