如何将听写列表转换成。。。。?

2024-06-02 06:53:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 列表datetimedatefoobarlivalues
3条回答

像这样的?你知道吗

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

我认为外部收藏是一个dict更有意义:

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

减少函数大小的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'}]}]

如果您的dict中有比foodatebar更多的项,或者如果您删除了一些项,那么这个解决方案仍然有效。总之,如果您的dict中至少有一个date项,那么它将起作用。你知道吗

相关问题 更多 >