Найти - Пользователи
Полная версия: Сравнение 2-х списков словарей.
Начало » Python для новичков » Сравнение 2-х списков словарей.
1
KsenZ
Доброго времени суток.
Собственно что есть. 2 списка словарей
 available_domains = [{"name": "site.ru", "id": 1}, {"name": "open.site.ru", "id": 2}, {"name": "close.site.ru", "id": 3}]
domains = [{"name": "site.ru", "ip": "1.1.1.1"}, {"name": "open.site.ru", "ip": "1.1.1.2"}, {"name": "test-test.site.ru", "ip": "1.1.1.1"}]
Нужно их как то сравнить, и если есть совпадение по ключу name в обоих списках, то добавить этот словарь из domans в новый список. Если совпадения нет (в моем примере это {“name”: “test-test.site.ru”, “ip”: “1.1.1.1”} ), то поместить его в другой список.
Как я попробовал сделать:
 available_domains = [{"name": "site.ru", "id": 1}, {"name": "open.site.ru", "id": 2}, {"name": "close.site.ru", "id": 3}]
domains = [{"name": "site.ru", "ip": "1.1.1.1"}, {"name": "open.site.ru", "ip": "1.1.1.2"}, {"name": "test-test.site.ru", "ip": "1.1.1.1"}]
update_domains = []
new_domains = []
for available_domain in available_domains:
    for domain in domains:
        if domain['name'] == available_domain['name']:
            update_domains.append(domain)
        else:
            new_domains.append(domain)
print(update_domains)
print('------------')
print(new_domains)
Получаю вывод:
[{'name': 'site.ru', 'ip': '1.1.1.1'}, {'name': 'open.site.ru', 'ip': '1.1.1.2'}]
------------
[{'name': 'open.site.ru', 'ip': '1.1.1.2'}, {'name': 'test-test.site.ru', 'ip': '1.1.1.1'}, {'name': 'site.ru', 'ip': '1.1.1.1'}, {'name': 'test-test.site.ru', 'ip': '1.1.1.1'}, {'name': 'site.ru', 'ip': '1.1.1.1'}, {'name': 'open.site.ru', 'ip': '1.1.1.2'}, {'name': 'test-test.site.ru', 'ip': '1.1.1.1'}]
Здесь проблема в том, что в new_domains попадают словари из domains 2 раза. А должен, по идее, попасть только {“name”: “test-test.site.ru”, “ip”: “1.1.1.1”}

Ткните носом, где я не прав, и как это лучше реализовать.
vic57
 >>> a = [{"name": "site.ru", "id": 1}, {"name": "open.site.ru", "id": 2}, {"name": "close.site.ru", "id": 3}]
>>> d = [{"name": "site.ru", "ip": "1.1.1.1"}, {"name": "open.site.ru", "ip": "1.1.1.2"}, {"name": "test-test.site.ru", "ip": "1.1.1.1"}]
>>> l = [i['name'] for i in a]
>>> [i for i in d if i['name'] in l]
[{'name': 'site.ru', 'ip': '1.1.1.1'}, {'name': 'open.site.ru', 'ip': '1.1.1.2'}]
>>> [i for i in d if not i['name'] in l]
[{'name': 'test-test.site.ru', 'ip': '1.1.1.1'}]
>>> 
KsenZ
Спасибо, то, что нужно
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB