如何用Python合并列表中的词典

2024-10-03 21:36:10 发布

您现在位置: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'},
]

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


Tags: keyinfortimestartendscheduledel
3条回答

你可以做:

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,在第二种解决方案中是使用groupby。你知道吗

因此,编辑后的情况如下所示:

  • 对于每一个键,您都要检查该键的值
  • 其中值分别排序
  • 基本上,您已经对每个键的值列表进行了排序

我的尝试是不使用字符串连接索引,而是继续将其用作索引。你知道吗

sched = {}
for key in f.keys():
    for idx, value in enumerate(f.getlist(key), 1):
        if idx not in sched:
            sched[idx] = {}
        sched[idx][key] = value

这应该给你一个dict,其中键是你的升序索引是键,值是你想要的dict。如果你需要一个列表,你可以把它转换成一个。。。你知道吗

使用我的代码(在函数参数中输入数据)

def merge(_list):
    my_list = [] #data my_list
    for data in _list: #foreach in _list
        pq = ''.join([a for a in data]) #get string
        try:
           number = int(pq[-1]) #get number of last string (schedule1 -> 1)
        except:
           print("List can't be decoded")
        try:
           my_list[number-1] += [data]
        except:
           my_list.append([data])
    for x in range(len(my_list)):
        sub = {} #data sub
        for n in my_list[x]:
            sub.update(n) #update dictionary n
        my_list[x] = sub
    return my_list #returning my_list

这是一个有点长,因为这是如此困难的算法没有任何模块。你知道吗

要使用此merge函数

data = [{'schedule_day1': 'Sunday'}, {'schedule_day2': 'Saturday'}, {'start_at1': '01:00'}, {'start_at2': '03:00'}, {'end_at1': '02:00'}, {'end_at2': '04:00'}]
data = merge(data)
print(data) 
#print out [{'schedule_day1': 'Sunday', 'start_at1': '01:00', 'end_at1': '02:00'}, {'schedule_day2': 'Saturday', 'start_at2': '03:00', 'end_at2': '04:00'}]

相关问题 更多 >