Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2018 08:58:36

KsenZ
Зарегистрирован: 2016-11-07
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Сравнение 2-х списков словарей.

Доброго времени суток.
Собственно что есть. 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”}

Ткните носом, где я не прав, и как это лучше реализовать.

Отредактировано KsenZ (Апрель 7, 2018 08:59:55)

Офлайн

#2 Апрель 7, 2018 10:21:20

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Сравнение 2-х списков словарей.

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

Офлайн

#3 Апрель 7, 2018 10:36:11

KsenZ
Зарегистрирован: 2016-11-07
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Сравнение 2-х списков словарей.

Спасибо, то, что нужно

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version