Reputation: 11
UG=[
{"group_member":"myGroup1","user_name":"tom"},
{"group_member":"myGroup2","user_name":"wilson"},
{"group_member":"myGroup1","user_name":"kevin"},
{"group_member":"myGroup2","user_name":"donna"},
{"group_member":"myGroup3","user_name":"john"},
{"group_member":"myGroup1","user_name":"steve"},
{"group_member":"myGroup2","user_name":"jose"},
{"group_member":"myGroup3","user_name":"jags"}]
PG=[
{"group_member":"myGroup1","device_name":"device1"},
{"group_member":"myGroup1","device_name":"device2"},
{"group_member":"myGroup2","device_name":"device1"},
{"group_member":"myGroup1","device_name":"device2"},
{"group_member":"myGroup1","device_name":"device3"},
{"group_member":"myGroup3","device_name":"device1"}]
DG=[
{"device_name":"device1","server":"server1"},
{"device_name":"device2","server":"server2"},
{"device_name":"device3","server":"server3"},
{"device_name":"device4","server":"server4"},
{"device_name":"device5","server":"server5"},
{"device_name":"device6","server":"server6"}
]
I need to compare the lists and prepare a list of dictionary with the following condition
UG[i]['group_member'] == PG[j]['group_member'] && PG[j]['device_name'] == UG[k]['device_name']
here is my implementation
# output array
output=[]
for i in DG:
for j in PG:
if i["device_name"] == j["device_name"]:
for k in UG:
if k["group_member"] == j["group_member"]:
output.append({"user_name":k["user_name"],"group_member":k["group_member"],"device_name":j["device_name"],"server":i["server"]})
for m in output:
print m
desired output============
[
{'server': 'server1', 'user_name': 'tom', 'group_member': 'myGroup1', 'device_name': 'device1'},
{'server': 'server1', 'user_name': 'kevin', 'group_member': 'myGroup1', 'device_name': 'device1'},
{'server': 'server1', 'user_name': 'steve', 'group_member': 'myGroup1', 'device_name': 'device1'},
{'server': 'server1', 'user_name': 'wilson', 'group_member': 'myGroup2', 'device_name': 'device1'}
{'server': 'server1', 'user_name': 'donna', 'group_member': 'myGroup2', 'device_name': 'device1'},
{'server': 'server1', 'user_name': 'jose', 'group_member': 'myGroup2', 'device_name': 'device1'},
{'server': 'server1', 'user_name': 'john', 'group_member': 'myGroup3', 'device_name': 'device1'},
{'server': 'server1', 'user_name': 'jags', 'group_member': 'myGroup3', 'device_name': 'device1'},
{'server': 'server2', 'user_name': 'tom', 'group_member': 'myGroup1', 'device_name': 'device2'},
{'server': 'server2', 'user_name': 'kevin', 'group_member': 'myGroup1', 'device_name': 'device2'},
{'server': 'server2', 'user_name': 'steve', 'group_member': 'myGroup1', 'device_name': 'device2'},
{'server': 'server2', 'user_name': 'tom', 'group_member': 'myGroup1', 'device_name': 'device2'},
{'server': 'server2', 'user_name': 'kevin', 'group_member': 'myGroup1', 'device_name': 'device2'},
{'server': 'server2', 'user_name': 'steve', 'group_member': 'myGroup1', 'device_name': 'device2'},
{'server': 'server3', 'user_name':'tom', 'group_member': 'myGroup1', 'device_name': 'device3'},
{'server': 'server3', 'user_name': 'kevin', 'group_member': 'myGroup1', 'device_name': 'device3'},
{'server': 'server3', 'user_name': 'steve', 'group_member': 'myGroup1', 'device_name': 'device3'}
]
how can i improve my implementation?
Upvotes: 0
Views: 50
Reputation: 15370
If you have thousands of records here is generator
from itertools import product
def produce():
for dg, pg, ug in product(DG, PG, UG):
if pg['device_name'] == dg['device_name'] and ug['group_member'] == pg['group_member']:
item = dg.copy()
item.update(pg)
item.update(ug)
yield item
Upvotes: 1
Reputation: 13510
Yes, it can be done using a list comprehension. But first let's create a functional dict update function, since dict
's update method doesn't return a new dict (but, rather, updates the current one):
def updt(d1, d2):
d3 = d1.copy()
d3.update(d2)
return d3
Now let's get wild with the list comprehension:
dictlist = [updt(updt(ug, pg), dg) for ug in UG for pg in PG for dg in DG if ug['group_member'] == pg['group_member'] and pg['device_name'] == dg['device_name']]
Here is the result:
for d in dictlist:
print(d)
And you have:
{'user_name': 'tom', 'server': 'server1', 'group_member': 'myGroup1', 'device_name': 'device1'}
{'user_name': 'tom', 'server': 'server2', 'group_member': 'myGroup1', 'device_name': 'device2'}
{'user_name': 'tom', 'server': 'server2', 'group_member': 'myGroup1', 'device_name': 'device2'}
{'user_name': 'tom', 'server': 'server3', 'group_member': 'myGroup1', 'device_name': 'device3'}
{'user_name': 'wilson', 'server': 'server1', 'group_member': 'myGroup2', 'device_name': 'device1'}
{'user_name': 'kevin', 'server': 'server1', 'group_member': 'myGroup1', 'device_name': 'device1'}
{'user_name': 'kevin', 'server': 'server2', 'group_member': 'myGroup1', 'device_name': 'device2'}
{'user_name': 'kevin', 'server': 'server2', 'group_member': 'myGroup1', 'device_name': 'device2'}
{'user_name': 'kevin', 'server': 'server3', 'group_member': 'myGroup1', 'device_name': 'device3'}
{'user_name': 'donna', 'server': 'server1', 'group_member': 'myGroup2', 'device_name': 'device1'}
{'user_name': 'john', 'server': 'server1', 'group_member': 'myGroup3', 'device_name': 'device1'}
{'user_name': 'steve', 'server': 'server1', 'group_member': 'myGroup1', 'device_name': 'device1'}
{'user_name': 'steve', 'server': 'server2', 'group_member': 'myGroup1', 'device_name': 'device2'}
{'user_name': 'steve', 'server': 'server2', 'group_member': 'myGroup1', 'device_name': 'device2'}
{'user_name': 'steve', 'server': 'server3', 'group_member': 'myGroup1', 'device_name': 'device3'}
{'user_name': 'jose', 'server': 'server1', 'group_member': 'myGroup2', 'device_name': 'device1'}
{'user_name': 'jags', 'server': 'server1', 'group_member': 'myGroup3', 'device_name': 'device1'}
which seems to be what you want, although in a different order.
Upvotes: 2