更好的听写理解方法

2024-09-29 19:01:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如何改进我的实施


Tags: nameserverdevicegroupmemberserver1tomkevin
2条回答

是的,可以用列表来理解。但是首先让我们创建一个函数dict update函数,因为dict的update方法不会返回新的dict(而是更新当前的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'}

这似乎是你想要的,虽然顺序不同

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

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

相关问题 更多 >

    热门问题