Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Python中的词典列表_Python - Fatal编程技术网

比较Python中的词典列表

比较Python中的词典列表,python,Python,我读过各种各样的问题,但我发现没有一个与这种情况完全匹配,我无法理解 我想比较两个字典列表。我不想检查单个键值对,我想检查整个字典与另一个字典,但问题是一个列表中的一个字典有一个额外的项“id”,而另一个列表没有,所以我不需要比较 状态代码和描述不是唯一的 只是笛卡尔可能会改变,但就我而言,整个事情都改变了 样本数据: data_db = [ { "id": 1, "status_code": 2, "desc": "Description sample1" }, { "id":

我读过各种各样的问题,但我发现没有一个与这种情况完全匹配,我无法理解

我想比较两个字典列表。我不想检查单个键值对,我想检查整个字典与另一个字典,但问题是一个列表中的一个字典有一个额外的项“id”,而另一个列表没有,所以我不需要比较

状态代码和描述不是唯一的

只是笛卡尔可能会改变,但就我而言,整个事情都改变了

样本数据:

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 = [
    {
        "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_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" }
]

lst = []
for dct in data_api:
    for dct2 in data_db:
        if all(dct[key] == dct2[key] for key in dct):
            break
    else:
        lst.append(dct)

lst2 = []
for dct2 in data_db:
    for dct in data_api:
        if all(dct[key] == dct2[key] for key in dct):
            break
    else:
        lst2.append(dct2["id"])

print(lst)
print(lst2)

重新格式化
数据\u 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]
这有帮助吗

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]

使用重新格式化的
数据\u db
。写出这个问题实际上帮助我了解了很多,并开始思考这个问题。将来遇到什么问题时,你应该试试看!同样的事情已经发生在我身上很多次了:)谢谢。穿得漂亮,又短又甜/像蟒蛇一样!干杯也有一种方法可以使用原始数据结构来实现,但是您需要额外的函数或lambda函数,而我也无法理解其中的这一部分。