Python字典操作列表

时间:2018-02-07 08:29:22

标签: python list dictionary data-manipulation

我最近制作的当前个人脚本存在问题,该脚本使用了一系列词典以及如何实现某种类型的结构。

这是原始结构:

[
{'airfare': 1000, 'place': 'nameOfPlace', 'email_to': 'yahooEmail@yahoo.com, gmailEmail@gmail.com'},
{'airfare': 2000, 'place': 'nameOfPlace', 'email_to': 'yahooEmail@yahoo.com'},
{'airfare': 3000, 'place': 'nameOfPlace', 'email_to': 'gmailEmail@gmail.com'},
{'airfare': 4000, 'place': 'nameOfPlace', 'email_to': 'liveEmail@live.com'}
]

我希望实现这样的目标,我不知道这是否可能:

[{'email_to': 'yahooEmail@yahoo.com',
    'flight_details':[{'airfare': 1000, 'place': 'nameOfPlace' },
                        {'airfare': 2000, 'place': 'nameOfPlace'}]},
{'email_to': 'gmailEmail@gmail.com',
    'flight_details':[{'airfare': 1000, 'place': 'nameOfPlace'},                                                            
                        {'airfare': 3000, 'place': 'nameOfPlace'}]},
{'email_to': 'liveEmail@live.com',
    'flight_details':[{'airfare': 4000, 'place': 'nameOfPlace'}]}]

编辑: 我使用python 3.5并从sqlite数据库中获取数据。根据 原始结构 ,数据存储在字典列表中,我希望根据我提供的第二个结构将其保存在json文件中。

1 个答案:

答案 0 :(得分:1)

这会将字典操作为您需要的格式。但是以json出口可能是另一个问题。

d = [
{'airfare': 1000, 'place': 'nameOfPlace', 'email_to': 'yahooEmail@yahoo.com, gmailEmail@gmail.com'},
{'airfare': 2000, 'place': 'nameOfPlace', 'email_to': 'yahooEmail@yahoo.com'},
{'airfare': 3000, 'place': 'nameOfPlace', 'email_to': 'gmailEmail@gmail.com'},
{'airfare': 4000, 'place': 'nameOfPlace', 'email_to': 'liveEmail@live.com'}
]

from collections import defaultdict

d_new = defaultdict(lambda: defaultdict(list))

for i in d:
    i['email_to'] = i['email_to'].split(', ')
    for email in i['email_to']:
        d_new[email]['flight_details'].append({'airfare': i['airfare'], 'place': i['place']})

d_new


# defaultdict(<function __main__.<lambda>>,
#             {'gmailEmail@gmail.com': defaultdict(list,
#                          {'flight_details': [{'airfare': 1000,
#                             'place': 'nameOfPlace'},
#                            {'airfare': 3000, 'place': 'nameOfPlace'}]}),
#              'liveEmail@live.com': defaultdict(list,
#                          {'flight_details': [{'airfare': 4000,
#                             'place': 'nameOfPlace'}]}),
#              'yahooEmail@yahoo.com': defaultdict(list,
#                          {'flight_details': [{'airfare': 1000,
#                             'place': 'nameOfPlace'},
#                            {'airfare': 2000, 'place': 'nameOfPlace'}]})})