【问题标题】:Is there any way to merge two list of dictionaries in python without having duplicates有没有办法在python中合并两个字典列表而没有重复
【发布时间】:2021-08-06 09:23:51
【问题描述】:

我想在python中将这两个字典列表合并为一个-

输入

arr1 = [
{ "field": 'nickname', "direction": 'ASC' },
{ "field": 'email', "direction": 'ASC' },
{ "field": 'name', "direction": 'ASC' },
{ "field": 'first_name', "direction": 'ASC' }
]

arr2 = [
{ "field" : "nickname", "direction" : "DESC"},
{ "field" : "email", "direction" : "DESC"},
{ "field" : "last_name", "direction" : "DESC"}
]

并且需要输出 -

输出

[
    { field: "nickname",   direction: "DESC"},
    { field: "email",      direction: "DESC"},
    { field: "last_name",  direction: "DESC"},
    { field: "name",       direction: "ASC" },
    { field: "first_name", direction: "ASC" }
]

我的解决方案 -

arr1 = [
{ "field": 'nickname', "direction": 'ASC' },
{ "field": 'email', "direction": 'ASC' },
{ "field": 'name', "direction": 'ASC' },
{ "field": 'first_name', "direction": 'ASC' }
]

arr2 = [
{ "field" : "nickname", "direction" : "DESC"},
{ "field" : "email", "direction" : "DESC"},
{ "field" : "last_name", "direction" : "DESC"}
]

arr4 = arr2;
arr3 = []

for i in range(0, len(arr1)):
    for j in range(0, len(arr2)):
        flag = 0
        if(arr1[i]['field'] == arr2[j]['field']):
            arr3.append(arr2[j])
            arr4.remove(arr2[j])
            flag = 1
            break
    if flag == 0 :
        arr3.append(arr1[i])

arr3 += arr4
print(arr3)

我尝试了几种方法,但需要在 O(n) 复杂度中完成,并且不修改 arr2。有什么办法吗?

【问题讨论】:

    标签: python list dictionary data-structures


    【解决方案1】:

    试试:

    out = {}
    for d in arr1 + arr2:
        out[d["field"]] = d["direction"]
    
    out = [{"field": k, "direction": v} for k, v in out.items()]
    print(out)
    

    打印:

    [
        {"field": "nickname", "direction": "DESC"},
        {"field": "email", "direction": "DESC"},
        {"field": "name", "direction": "ASC"},
        {"field": "first_name", "direction": "ASC"},
        {"field": "last_name", "direction": "DESC"},
    ]
    

    【讨论】:

      【解决方案2】:

      单线将适用于熊猫:

      df=pd.DataFrame.from_dict(arr1).append(pd.DataFrame.from_dict(arr2)).drop_duplicates('field', keep='last').reset_index(drop=True)

      结果是:

              field direction
      0        name       ASC
      1  first_name       ASC
      2    nickname      DESC
      3       email      DESC
      4   last_name      DESC
      

      【讨论】:

        【解决方案3】:

        算法应该很简单:

        1. 为结果创建一个新地图
        2. 确定每个输入 Map(或 Map 列表)中的哪些键/值对在发生冲突时应优先考虑(重复键映射到不同的值)
        3. 在输入映射上编写迭代构造,考虑顺序和优先级。

        问:地图列表中较早出现的地图的键是否应保留其值?或者地图的键是否应该出现在地图列表的后面?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-12
          • 2017-12-11
          • 2019-07-12
          • 1970-01-01
          • 2012-04-17
          • 2021-12-04
          • 1970-01-01
          相关资源
          最近更新 更多