如果字典的键值有另一个相同的键值而忽略未组合的字典,您如何组合字典的键值?

时间:2021-04-03 14:20:08

标签: python list for-loop object

我有一个对象列表,如下所示:

[ 
  {"title":"cdap_tests", "datacenter":"B1", "count_failed": 1},
  {"title":"cdap_tests", "datacenter":"G1", "count_failed": 1},
  {"title":"cdap_tests", "datacenter":"GOV1", "count_failed": 1},
  {"title":"developer_portal_tests", "datacenter":"B1", "count_failed": 1}
]

我想将具有相同标题属性的对象组合在一起,如下所示:

[ 
  {"title":"cdap_tests", "datacenter":"B1,G1,GOV1", "count_failed": 1},
  {"title":"developer_portal_tests", "datacenter":"B1", "count_failed": 1}
]

我尝试根据它们的属性将每个字符串与另一个字符串进行比较,如果它们相同,则将字符串添加到另一个字符串,但由于某种原因它没有组合它们,我只是从函数中获取相同的数据返回

    new_data_list = []
    for row_to_compare_to in data:
        for row_to_compare_from in data:
            if row_to_compare_from["datacenter"] == row_to_compare_to["datacenter"]:
                pass
            elif row_to_compare_from["title"] == row_to_compare_to["title"]:
                row_to_compare_to["datacenter"] = f"{row_to_compare_from['datacenter']}, {row_to_compare_to['datacenter']}"
                row_to_compare_to["count_failed"] = f"{row_to_compare_from['count_failed']}, {row_to_compare_to['count_failed']}"
        new_data_list.append(row_to_compare_to)
    return new_data_list

有人能指出我做错了什么吗?或者更简洁的解决方案?

1 个答案:

答案 0 :(得分:0)

该代码产生错误,因为 "count_failed" 并非在每个字典中。

如果我从头开始,我可能会将原始 data 列表替换为字典字典,其中外部字典的键是每个条目的标题。这将导致代码更易于阅读。我也可能将像 "B1,G1,GOV1" 这样的附加数据变成一个列表,而不是 ["B1", "G1", "GOV1"]

我确定我的方法不是最有效的或 Pythonic 的,但我相信它有效:

new_data_list = []
for raw_dct in data:
    if raw_dct['title'] in [dct['title'] for dct in new_data_list]:
        for new_dct in new_data_list:
            if raw_dct['title'] == new_dct['title']:
                for k, v in raw_dct.items():
                    if k in new_dct.keys():
                        if type(v) is str:
                            if v not in new_dct[k]:
                                new_dct[k] += "," + str(v)
                        if type(v) is int:
                            new_dct[k] += v
                    else:
                        new_dct[k] = v
    else:
        new_data_list.append(raw_dct)

它给出了你想要的 new_data_list,同时也考虑了像 "count_failed" 这样的整数属性的计数。