【问题标题】:How to merge dictionary in list with Python如何用Python合并列表中的字典
【发布时间】:2020-02-09 16:43:35
【问题描述】:

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

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

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

【问题讨论】:

  • 那么你做了什么?
  • 这似乎是你有一个完全其他的问题要解决,并以某种方式进入了你现在试图清理的这个烂摊子。为什么您的起始数据如此“奇怪”?也许调整产生起始数据的算法。这可能吗?
  • 您能否详细说明数据的格式?例如,schedule 键总是在前面,它们是按数字排序的吗?
  • 我已经编辑了我的问题,如果仍然提出令人困惑的问题,请见谅。
  • @GofyandKitty,你能把request.form.items()的输出贴出来吗?

标签: python arrays pandas list dictionary


【解决方案1】:

你可以这样做:

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

或者因为你标记了 pandas:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您好,感谢您为回答我的问题做出的贡献,这是一个很好的答案,但我找到了一个简单的答案,谢谢,我投票赞成您的答案。
    【解决方案3】:

    所以在您编辑之后,情况如下:

    • 对于每个键,您都在遍历该键的值
    • 值分别排序的位置
    • 基本上你已经对每个键的值列表进行了排序

    我的尝试是不将索引与字符串连接,而是继续将其用作索引。

    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
    

    这应该给你一个字典,其中键是你的升序索引是键,值是你想要的字典。如果您需要一个列表,您可以将其转换为一个...

    【讨论】:

    • 您好,感谢您为回答我的问题做出的贡献,这是一个很好的答案,但我找到了简单的答案,谢谢,我已经投票赞成您的答案。
    猜你喜欢
    • 2012-08-11
    • 2012-07-17
    • 2021-10-06
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多