2016-08-25 22 views
0
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"} 
    ] 

的方式,我需要比较列表,并在以下条件做得更好字典理解

UG[i]['group_member'] == PG[j]['group_member'] && PG[j]['device_name'] == UG[k]['device_name'] 

这里准备字典的名单是我实现

# 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 

所需的输出== ==========

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

我该如何改进我的实施?

回答

2

是的,它可以使用列表理解来完成。但首先让我们创建一个功能字典更新功能,因为dict的更新方法不返回一个新的字典(,而是更新当前的一个):

def updt(d1, d2): 
    d3 = d1.copy() 
    d3.update(d2) 
    return d3 

现在让我们疯狂与列表理解:

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

下面是结果:

for d in dictlist: 
    print(d)    

而且你必须:


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

这似乎是你想要的,尽管顺序不同。

+1

我建议使用'itertools.product'以提高可读性进一步:'[...为UG,PG,DG产品(UG, PG,DG)如果...]'。 –

+0

@IljaEverilä就像这个想法一样,尝试了它,但它仍然是相同的表达长度。比较:'对于UG中的UG for PG for DG for DG' to'for ug,pg,dg in product(UG,PG,DG)''。我甚至喜欢使用模块名称,所以它变成了'itertools.product' ... –

+0

就我个人而言,我只是发现它更容易推理一个笛卡尔产品调用,而不是重复... for ... for .. 。 结构体。 YMMV :) –

1

如果你有成千上万的记录在这里是发电机

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