首页 > 解决方案 > 如何用Python合并列表中的字典

问题描述

我使用以下代码从表单生成数据:

time_schedule = []
f = request.form
for key in f.keys():
    for idx, value in enumerate(f.getlist(key), 1):
        time_schedule.append({key+str(idx): value})

然后我得到了这个结果print

[{'csrf_token1': 'Ijg2YWEyNDEwMWI3ZTE4NjYyNzBkNTEwYTZlMzRiYTM3MjY2ZTk2NDAi.XaGmZw.rMR9Q53hlAQV-Ul9X3PHT55TMxc'}, {'course_start_at1': '2019-10-26'}, {'schedule_day1': 'Sunday'}, {'schedule_day2': 'Saturday'}, {'start_at1': '01:00'}, {'start_at2': '03:00'}, {'end_at1': '02:00'}, {'end_at2': '04:00'}, {'step1': 'input_teacher_email'}]

然后我删除了不必要的值:

del time_schedule[0]
del time_schedule[0]
del time_schedule[-1]

那么我现在的值是:

[{'schedule_day1': 'Sunday'}, {'schedule_day2': 'Saturday'}, {'start_at1': '01:00'}, {'start_at2': '03:00'}, {'end_at1': '02:00'}, {'end_at2': '04:00'}]

现在我想把它合并成这样:

[
    {'schedule_day1': 'Sunday', 'start_at1': '01:00', 'end_at1': '02:00'},
    {'schedule_day2': 'Saturday', 'start_at2': '03:00', 'end_at2': '04:00'},
]

但不确定如何在最佳实践中做到这一点。请,任何答案,来源或教程如何将不胜感激..?:)

标签: pythonarrayspandaslistdictionary

解决方案


你可以这样做:

import re
from collections import defaultdict

data = [
    {'schedule_day1': 'Sunday'},
    {'schedule_day2': 'Saturday'},
    {'start_at1': '01:00'},
    {'start_at2': '03:00'},
    {'end_at1': '02:00'},
    {'end_at2': '04:00'}
]


seen = defaultdict(dict)
for d in data:
    for name, value in d.items():
        key = re.search('(\d+)$', name).group()  # this is the key extractor
        seen[key][name] = value

result = list(seen.values())

print(result)

输出

[{'schedule_day1': 'Sunday', 'start_at1': '01:00', 'end_at1': '02:00'}, {'schedule_day2': 'Saturday', 'start_at2': '03:00', 'end_at2': '04:00'}]

或者因为你标记了熊猫:

import pandas as pd   

df = pd.DataFrame(data=[item for d in data for item in d.items()], columns=['name', 'value'])
grouper = df.groupby(df.name.str.extract('(\d+)$').squeeze())
result = [dict(zip(group.name, group.value)) for _, group in grouper]
print(result)

输出

[{'schedule_day1': 'Sunday', 'start_at1': '01:00', 'end_at1': '02:00'}, {'schedule_day2': 'Saturday', 'start_at2': '03:00', 'end_at2': '04:00'}]

两种方法的关键是按字典每个键的最后一位数字进行分组,在第一个解决方案中,这是使用seen字典完成的(实际上是defaultdict,在第二个解决方案中使用 pandas groupby


推荐阅读