compare two list of dictionaries

Mohan L l.mohanphy at gmail.com
Thu Oct 3 22:29:26 EDT 2013


On Fri, Oct 4, 2013 at 12:14 AM, MRAB <python at mrabarnett.plus.com> wrote:

> On 03/10/2013 17:11, Mohan L wrote:
>
>> Dear All,
>>
>> I have two list of dictionaries like below:
>>
>> In the below dictionaries the value of ip can be either hostname or ip
>> address.
>>
>> output1=[
>> {'count': 3 , 'ip': 'xxx.xx.xxx.1'},
>> {'count': 4, 'ip': 'xxx.xx.xxx.2'},
>> {'count': 8, 'ip': 'xxx.xx.xxx.3'},
>> {'count': 10, 'ip': 'xxx.xx.xxx.4'},
>> {'count': 212, 'ip': 'hostname1'},
>> {'count': 27, 'ip': 'hostname2'},
>> {'count': 513, 'ip': 'hostname3'},
>> {'count': 98, 'ip': 'hostname4'},
>> {'count': 1, 'ip': 'hostname10'},
>> {'count': 2, 'ip': 'hostname8'},
>> {'count': 3, 'ip': 'xxx.xx.xxx.11'},
>> {'count': 90, 'ip': 'xxx.xx.xxx.12'},
>> {'count': 12, 'ip': 'xxx.xx.xxx.13'},
>> {'count': 21, 'ip': 'xxx.xx.xxx.14'},
>> {'count': 54, 'ip': 'xxx.xx.xxx.15'},
>> {'count': 34, 'ip': 'xxx.xx.xxx.16'},
>> {'count': 11, 'ip': 'xxx.xx.xxx.17'},
>> {'count': 2, 'ip': 'xxx.xx.xxx.18'},
>> {'count': 19, 'ip': 'xxx.xx.xxx.19'},
>> {'count': 21, 'ip': 'xxx.xx.xxx.20'},
>> {'count': 25, 'ip': 'xxx.xx.xxx.21'},
>> {'count': 31, 'ip': 'xxx.xx.xxx.22'},
>> {'count': 43, 'ip': 'xxx.xx.xxx.23'},
>> {'count': 46, 'ip': 'xxx.xx.xxx.24'},
>> {'count': 80, 'ip': 'xxx.xx.xxx.25'},
>> {'count': 91, 'ip': 'xxx.xx.xxx.26'},
>> {'count': 90, 'ip': 'xxx.xx.xxx.27'},
>> {'count': 10, 'ip': 'xxx.xx.xxx.28'},
>> {'count': 3, 'ip': 'xxx.xx.xxx.29'}]
>>
>>
>> In the below dictionaries have either hostname or ip or both.
>>
>> output2=(
>>
>> {'hostname': 'INNCHN01', 'ip_addr': 'xxx.xx.xxx.11'},
>> {'hostname': 'HYDRHC02', 'ip_addr': 'xxx.xx.xxx.12'},
>> {'hostname': 'INNCHN03', 'ip_addr': 'xxx.xx.xxx.13'},
>> {'hostname': 'MUMRHC01', 'ip_addr': 'xxx.xx.xxx.14'},
>> {'hostname': 'n/a', 'ip_addr': 'xxx.xx.xxx.15'},
>> {'hostname': 'INNCHN05', 'ip_addr': 'xxx.xx.xxx.16'},
>> {'hostname': 'hostname1', 'ip_addr': 'n/a'},
>> {'hostname': 'hostname2', 'ip_addr': 'n/a'},
>> {'hostname': 'hostname10', 'ip_addr': ''},
>> {'hostname': 'hostname8', 'ip_addr': ''},
>> {'hostname': 'hostname200', 'ip_addr': 'xxx.xx.xxx.200'},
>> {'hostname': 'hostname300', 'ip_addr': 'xxx.xx.xxx.400'},
>>
>> )
>>
>> trying to get the following difference from the above dictionary
>>
>> 1). compare the value of 'ip' in output1 dictionary with either
>> 'hostname' and 'ip_addr' output2 dictionary and print their
>> intersection. Tried below code:
>>
>>
>> for doc in output1:
>>          for row in output2:
>>                  if((row["hostname"] == doc["ip"]) or (row["ip_addr"] ==
>> doc["ip"])):
>>                          print doc["ip"],doc["count"]
>>
>> *output:*
>>
>> hostname1 212
>> hostname2 27
>> hostname10 1
>> hostname8 2
>> xxx.xx.xxx.11 3
>> xxx.xx.xxx.12 90
>> xxx.xx.xxx.13 12
>> xxx.xx.xxx.14 21
>> xxx.xx.xxx.15 54
>> xxx.xx.xxx.16 34
>>
>>  1. Create a dict from output1 in which the key is the ip and the value
> is the count.
>
> 2. Create a set from output2 containing all the hostnames and ip_addrs.
>
> 3. Get the intersection of the keys of the dict with the set.
>
> 4. Print the entries of the dict for each member of the intersection.
>
>
>  2). need to print the below output if the value of 'ip' in output1
>> dictionary is not there in in output2 dictionary(ip/hostname which is
>> there in output1 and not there in output2):
>>
>>   xxx.xx.xxx.1 3
>>   xxx.xx.xxx.2 4
>>   xxx.xx.xxx.3  8
>>   xxx.xx.xxx.4  10
>>   hostname3  513
>>   hostname4  98
>>   xxx.xx.xxx.17  11
>>   xxx.xx.xxx.18  2
>>   xxx.xx.xxx.19  19
>>   xxx.xx.xxx.20  21
>>   xxx.xx.xxx.21  25
>>   xxx.xx.xxx.22  31
>>   xxx.xx.xxx.23  43
>>   xxx.xx.xxx.24  46
>>   xxx.xx.xxx.25  80
>>   xxx.xx.xxx.26  91
>>   xxx.xx.xxx.27  90
>>   xxx.xx.xxx.28  10
>>   xxx.xx.xxx.29  3
>>
>>  1. Get the difference between the keys of the dict and the intersection.
>
> 2. Print the entries of the dict for each member of the difference.



#!/bin/env python
import sys


output1=[
{'count': 3 , 'ip': 'xxx.xx.xxx.1'},
{'count': 4, 'ip': 'xxx.xx.xxx.2'},
{'count': 8, 'ip': 'xxx.xx.xxx.3'},
{'count': 10, 'ip': 'xxx.xx.xxx.4'},
{'count': 212, 'ip': 'hostname1'},
{'count': 27, 'ip': 'hostname2'},
{'count': 513, 'ip': 'hostname3'},
{'count': 98, 'ip': 'hostname4'},
{'count': 1, 'ip': 'hostname10'},
{'count': 2, 'ip': 'hostname8'},
{'count': 3, 'ip': 'xxx.xx.xxx.11'},
{'count': 90, 'ip': 'xxx.xx.xxx.12'},
{'count': 12, 'ip': 'xxx.xx.xxx.13'},
{'count': 21, 'ip': 'xxx.xx.xxx.14'},
{'count': 54, 'ip': 'xxx.xx.xxx.15'},
{'count': 34, 'ip': 'xxx.xx.xxx.16'},
{'count': 11, 'ip': 'xxx.xx.xxx.17'},
{'count': 2, 'ip': 'xxx.xx.xxx.18'},
{'count': 19, 'ip': 'xxx.xx.xxx.19'},
{'count': 21, 'ip': 'xxx.xx.xxx.20'},
{'count': 25, 'ip': 'xxx.xx.xxx.21'},
{'count': 31, 'ip': 'xxx.xx.xxx.22'},
{'count': 43, 'ip': 'xxx.xx.xxx.23'},
{'count': 46, 'ip': 'xxx.xx.xxx.24'},
{'count': 80, 'ip': 'xxx.xx.xxx.25'},
{'count': 91, 'ip': 'xxx.xx.xxx.26'},
{'count': 90, 'ip': 'xxx.xx.xxx.27'},
{'count': 10, 'ip': 'xxx.xx.xxx.28'},
{'count': 3, 'ip': 'xxx.xx.xxx.29'}]



output2=(('INNCHN01','xxx.xx.xxx.11'),
('HYDRHC02', 'xxx.xx.xxx.12'),
('INNCHN03','xxx.xx.xxx.13'),
('MUMRHC01','xxx.xx.xxx.14'),
('n/a','xxx.xx.xxx.15'),
('INNCHN05','xxx.xx.xxx.16'),
('hostname1','n/a'),
('hostname2','n/a'),
('hostname10',''),
('hostname8',''),
('hostname200','xxx.xx.xxx.200'),
('hostname300','xxx.xx.xxx.400'),
)

## 1).
## Create a dict from output1 in which the key is the ip and the value is
the count.
mongodb_data={}
for doc in output1:
        mongodb_data.update({doc['ip']:doc['count']})

## Create a set from output2 containing all the hostnames and ip_addrs.
all_hostname_ip_set=set(list(sum(output2, ())))

## Get the intersection of the keys of the dict with the set.
key_set=set(mongodb_data.keys())
int_keys=key_set & all_hostname_ip_set
# Print the entries of the dict for each member of the intersection.
print "-------------------intersection-----------------------------"
for key in int_keys:
        print key,mongodb_data[key]

## 2).
## Get the difference between the keys of the dict and the intersection.
deff_keys=key_set - all_hostname_ip_set
## Print the entries of the dict for each member of the difference.
print "-------------------difference-------------------------------"
for key in deff_keys:
    print key,mongodb_data[key]


$ ./demo.py

-------------------intersection-----------------------------
xxx.xx.xxx.11 3
xxx.xx.xxx.12 90
xxx.xx.xxx.13 12
xxx.xx.xxx.14 21
xxx.xx.xxx.15 54
xxx.xx.xxx.16 34
hostname2 27
hostname1 212
hostname10 1
hostname8 2
-------------------difference-------------------------------
xxx.xx.xxx.29 3
xxx.xx.xxx.28 10
xxx.xx.xxx.17 11
xxx.xx.xxx.18 2
xxx.xx.xxx.19 19
xxx.xx.xxx.23 43
xxx.xx.xxx.22 31
xxx.xx.xxx.25 80
xxx.xx.xxx.24 46
xxx.xx.xxx.27 90
xxx.xx.xxx.26 91
xxx.xx.xxx.2 4
xxx.xx.xxx.21 25
hostname3 513
hostname4 98
xxx.xx.xxx.4 10
xxx.xx.xxx.20 21
xxx.xx.xxx.1 3
xxx.xx.xxx.3 8


>


>
>  3). Ip address with is there only in output2 dictionary.
>>
>> xxx.xx.xxx.200
>> xxx.xx.xxx.400
>>
>>  1. Create a set from output2 containing all the ip_addrs


> 2. Get the difference between the set and the keys of the dict created
> from output1.


I have one problem here.  I want to compare the output2 (hostname or ip
address) with output1 'ip' values (i.e., either hostname or ip address of
output2 does not matching the ip dict key in output1  then I want to print
either hostname or ip address from output2).

Any help?

Thanks for your time.

Thanks
Mohan L

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20131004/03116ee7/attachment.html>


More information about the Python-list mailing list