2016-01-06 6 views
0

Я читал разные вопросы, но ничего не нашел, что вполне соответствует этому сценарию, и я не могу его размазать.Сравнение списков словарей в Python

Я хочу сравнить 2 списка словарей. Я не хочу проверять отдельные пары значений ключа, я хочу проверить весь словарь на другой, но полученный означает, что один из словарей в одном списке имеет дополнительный элемент «id», который другой список не так Мне не нужно сравнивать это.

status_code и убывание не являются уникальными

только убывание может измениться, но, насколько я понимаю все это потом изменилось.

Образец данных:

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" } 
    } 
] 

Спасибо!

+0

Go с отформатированного 'data_db'. –

+0

Написание вопроса на самом деле помогло мне сильно обдумать и обсудить эту мысль. Попробуй это в будущем, когда ты застрял/запутался! – s27840

+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

Спасибо. Пятно, короткое и сладкое/питоническое! – s27840

+0

Cheers. Есть способ сделать это и с вашей исходной структурой данных, но вам понадобится дополнительная функция или лямбда-функция, и я тоже не мог бы окутать ее в эту часть. –

0

Это не хорошее решение, и это зависит от конкретной структуры у вас есть, но это работает:

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) 
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] 
Смежные вопросы