比较Python中的词典列表

时间:2016-01-06 16:36:21

标签: python

我已经阅读过各种各样的问题,但是我发现没有什么能与这种情况完全匹配,我无法理解它。

我想比较2个词典列表。我不想检查单个键值对,我想检查整个字典与另一个,但问题是一个列表中的一个字典有一个额外的项目'id',另一个列表不是这样我不需要比较它。

status_code和desc不是唯一的

只是desc可以改变,但就我而言,整件事情已经改变了。

示例数据:

data_db = [
    { "id": 1, "status_code": 2, "desc": "Description sample1" },
    { "id": 2, "status_code": 4, "desc": "Description sample2" },
    { "id": 3, "status_code": 5, "desc": "Description sample3" },
    { "id": 4, "status_code": 5, "desc": "Description sample4" }
]

data_api = [
    { "status_code": 1, "desc": "Description sample5" },
    { "status_code": 4, "desc": "Description sample6" },
    { "status_code": 5, "desc": "Description sample3" }
]

预期产出:

missing_from_db = [
     { "status_code": 1, "desc": "Description sample4" },
     { "status_code": 4, "desc": "Description sample6" } # because in data_db it desc is different
]

missing_from_api = [1,2,4] # This can just be the ids from data_db

我希望这是有道理的(因为它让我感到困惑!)。

代码明智我没有想出任何远程关闭或有用的东西。我最近想到的是将data_db重新格式化为:

data_db = [
    {
        "id": 1, 
        "data": { "status_code": 2, "desc": "Description sample1" }
    },
    { 
        "id": 2, 
        "data": { "status_code": 4, "desc": "Description sample2" }
    },
    { 
        "id": 3, 
        "data": { "status_code": 5, "desc": "Description sample3" }
    },
    { 
        "id": 4, 
        "data": { "status_code": 5, "desc": "Description sample4" }
    }
]

谢谢!

3 个答案:

答案 0 :(得分:2)

重新格式化data_db应该有效:

data_db = [
    {
        "id": 1, 
        "data": { "status_code": 2, "desc": "Description sample1" }
    },
    { 
        "id": 2, 
        "data": { "status_code": 4, "desc": "Description sample2" }
    },
    { 
        "id": 3, 
        "data": { "status_code": 5, "desc": "Description sample3" }
    },
    { 
        "id": 4, 
        "data": { "status_code": 5, "desc": "Description sample4" }
    }
]

data_api = [
    { "status_code": 1, "desc": "Description sample5" },
    { "status_code": 4, "desc": "Description sample6" },
    { "status_code": 5, "desc": "Description sample3" }
]

#   checking the dicts in data_api against the 'data' sub-dicts in data_db
missing_from_db = [d for d in data_api if d not in [x['data'] for x in data_db]]

#   using similar comprehension to extract the 'id' vals of the 'data' in data_db which aren't in data_api
missing_from_api = [d['id'] for d in data_db if d['data'] not in data_api]

结果:

print missing_from_db

[{'status_code': 1, 'desc': 'Description sample5'}, 
 {'status_code': 4, 'desc': 'Description sample6'}]

print missing_from_api

[1, 2, 4]

答案 1 :(得分:0)

这不是一个很好的解决方案,它依赖于您拥有的特定结构,但它可以工作:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/plain");

    Map<String, String> properties = new HashMap();
    if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
        properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.GoogleDriver");
        properties.put("javax.persistence.jdbc.url", System.getProperty("cloudsql.device.url"));
    } else {
        properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver");
        properties.put("javax.persistence.jdbc.url", System.getProperty("cloudsql.device.url.dev"));
    }

    // List all the rows.

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(
                "transactions-optional-device", properties);
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        resp.getWriter().println("performing query");
        List<Device> result = em.createNamedQuery("Device.getDevices", Device.class).getResultList();
        resp.getWriter().println("Starting to list devices - " + result.size());
        for (Device g : result) {
            resp.getWriter().println(g.getA() + "_" + g.getB());
        }

        em.getTransaction().commit();
        em.close();

}

答案 2 :(得分:0)

这会有帮助吗

def find_missing(data1,data2):
    missig_from_data = list()
    for i in range(0,len(data2)):
        status = False
        dec = False
        for j in range(0,len(data1)):
            if data2[i]['status_code'] == data1[j]['status_code']:
                status = True
                if data2[i]['desc'] == data1[j]['desc']:
                    dec = True
        if (status == False and dec==False) or (status == True and dec==False) or (status == False and dec==True):
            missig_from_data.append(data2[i])

    return missig_from_data

data_db = [
    { "id": 1, "status_code": 2, "desc": "Description sample1" },
    { "id": 2, "status_code": 4, "desc": "Description sample2" },
    { "id": 3, "status_code": 5, "desc": "Description sample3" },
    { "id": 4, "status_code": 5, "desc": "Description sample4" }
]

data_api = [
    { "status_code": 1, "desc": "Description sample5" },
    { "status_code": 4, "desc": "Description sample6" },
    { "status_code": 5, "desc": "Description sample3" }
]

missig_from_data_db = find_missing(data_db,data_api)
missing_from_api = find_missing(data_api,data_db)
missing_from_api_1 = list()

for i in range(0,len(missing_from_api)): missing_from_api_1.append(missing_from_api[i]['id'])

print missig_from_data_db
print missing_from_api_1

输出:

[{'status_code': 1, 'desc': 'Description sample5'}, {'status_code': 4, 'desc': 'Description sample6'}]
[1, 2, 4]