python - 如何用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'},
]
但不确定如何在最佳实践中做到这一点。请,任何答案,来源或教程如何将不胜感激..?:)
解决方案
你可以这样做:
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。
推荐阅读
- java - spark-submit:传递 java 属性文件给出 FileNotFoundException
- node.js - Nodejs登录未定向到个人资料页面
- ios - 使用 Swift 对日文字符进行排序
- javascript - 使用 .attr() 添加数据属性时出现“TypeError: undefined is not an object”
- javascript - 与 Google reCaptcha v3 相关的问题
- listview - 带有滚动条的 Flutter Listview
- java - 如何从长度为 n 的字符串中获取长度为 k 的所有唯一排列的数量?
- google-apps-script - 当单元格与当前日期相同时发送电子邮件
- apache - 如何检查 http2 是否在我的网站上实施和工作?
- javascript - 通过 doc 中的 2 个参数查询集合