【问题标题】:Convert an unstructured list of dictionary to structured list of dictionary using python使用python将非结构化字典列表转换为结构化字典列表
【发布时间】:2021-11-10 15:29:59
【问题描述】:

我有以下内容作为输出。

    ['{end_date=2021-09-16 06:00:00, number=CHG1757, requested_by=Tom, cmdb_ci=Checkout, start_date=2021-09-16 03:00:00}',
 '{end_date=2021-09-16 09:00:00, number=CHG17486, requested_by=Bobby, cmdb_ci=Reservation, start_date=2021-09-16 03:00:00}',
 '{end_date=2021-09-16 12:00:00, number=CHG17441, requested_by=Ryan, cmdb_ci=Payment, start_date=2021-09-16 03:00:00}']

需要使用 python 脚本将上述输出转换为结构化的字典列表(见下文)。

 [{'end_date'='2021-09-16 06:00:00', 'number'='CHG1757', 'requested_by'='Tom', 'cmdb_ci'='Checkout', 'start_date'='2021-09-16 03:00:00'}',
 {'end_date'='2021-09-16 09:00:00', 'number'='CHG17486', 'requested_by'='Bobby', 'cmdb_ci'='Reservation', 'start_date'='2021-09-16 03:00:00'}',
 {'end_date'='2021-09-16 12:00:00', 'number'='CHG17441', 'requested_by'='Ryan', 'cmdb_ci'='Payment', 'start_date'='2021-09-16 03:00:00'}']

【问题讨论】:

    标签: python python-2.7 dictionary scripting dataformat


    【解决方案1】:

    Praful,你好吗?

    您可以尝试使用下面的代码,但仅当所有字符串的长度相同时才有效。

    stack = ['{end_date=2021-09-16 06:00:00, number=CHG1757, requested_by=Tom, cmdb_ci=Checkout, start_date=2021-09-16 03:00:00}',
             '{end_date=2021-09-16 09:00:00, number=CHG17486, requested_by=Bobby, cmdb_ci=Reservation, start_date=2021-09-16 03:00:00}',
             '{end_date=2021-09-16 12:00:00, number=CHG17441, requested_by=Ryan, cmdb_ci=Payment, start_date=2021-09-16 03:00:00}']
    
    splited = []
    for line in stack:
        splited.append(line.split(','))
    
    dict_to_fill = {}
    new_list = []
    for item in splited:
        dict_to_fill['end_date'] = item[0][10:]
        dict_to_fill['number'] = item[1][8:]
        dict_to_fill['requested_by'] = item[2][14:]
        dict_to_fill['cmdb_ci'] = item[3][9:]
        dict_to_fill['start_date'] = item[4][12:-1]
        new_list.append(dict_to_fill.copy())
    
    print(new_list)
    

    输出:

    [{'end_date': '2021-09-16 06:00:00',
      'number': 'CHG1757',
      'requested_by': 'Tom',
      'cmdb_ci': 'Checkout',
      'start_date': '2021-09-16 03:00:00'},
     {'end_date': '2021-09-16 09:00:00',
      'number': 'CHG17486',
      'requested_by': 'Bobby',
      'cmdb_ci': 'Reservation',
      'start_date': '2021-09-16 03:00:00'},
     {'end_date': '2021-09-16 12:00:00',
      'number': 'CHG17441',
      'requested_by': 'Ryan',
      'cmdb_ci': 'Payment',
      'start_date': '2021-09-16 03:00:00'}]
    

    告诉我是否有效。

    再见!

    【讨论】:

    • 我做得很好,谢谢。您的代码输出仅重复嵌套字典的最后一项。这里有小姐吗?请告诉我。感谢您的回答!
    • 很抱歉。如果要附加字典,我们需要复制它。否则 python 会将其视为参考。你必须把 new_list.append(dict_to_fill.copy())
    • 谢谢,这对我有用!
    • 你能帮我根据这个顺序中指定的键重新排列输出吗(cmdb_ci、number、request_by、start_date、end_date)。 [{cmdb_ci':'结帐','number':'CHG1757','requested_by':'Tom','start_date':'2021-09-16 03:00:00','end_date':'2021-09 -16 06:00:00',},...等等]
    【解决方案2】:

    请在下方找到动态代码来解决您的问题:

    stack = ['{end_date=2021-09-16 06:00:00, number=CHG1757, requested_by=Tom, cmdb_ci=Checkout, start_date=2021-09-16 03:00:00}',
             '{end_date=2021-09-16 09:00:00, number=CHG17486, requested_by=Bobby, cmdb_ci=Reservation, start_date=2021-09-16 03:00:00}',
             '{end_date=2021-09-16 12:00:00, number=CHG17441, requested_by=Ryan, cmdb_ci=Payment, start_date=2021-09-16 03:00:00}']
             
    output = []
    for data in stack:
        data = data.replace("{","").replace("}","").split(",")
        format_dict = {}
        for record in data:
            key, value = record.split("=")
            format_dict[key.strip()] = value.strip()
        output.append(format_dict)
    
    print(output)
        
        
    

    【讨论】:

    • 感谢 Vimlesh,这行得通。有没有办法根据这个顺序指定的键(cmdb_ci、number、request_by、start_date、end_date)重新排列输出。 [{cmdb_ci': 'Checkout','number': 'CHG1757','requested_by': 'Tom','start_date': '2021-09-16 03:00:00','end_date': '2021-09-16 06:00:00',},...and so on]
    • 这不是处理 dict 的好方法。我们可以根据某个键对字典列表进行排序,但为每个键排列字典本身是没有用的。
    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2018-08-10
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多