Python中不同列表的for循环输出错误
这是我的Python代码:
statuses = [
{'id': '1', 'plan_id': '124124124', 'ip': '1.1.1.1', 'name': 'Saeed1', 'status': 'active'},
{'id': '2', 'plan_id': '124224124', 'ip': '2.2.2.2', 'name': 'Saeed2', 'status': 'suspended'},
{'id': '3', 'plan_id': '164124124', 'ip': '3.3.3.3', 'name': 'Saeed3', 'status': 'suspended'},
{'id': '4', 'plan_id': '164124124', 'ip': '4.4.4.4', 'name': 'Saeed4', 'status': 'suspended'},
{'id': '5', 'plan_id': '124124124', 'ip': '5.5.5.5', 'name': 'Saeed51', 'status': 'active'},
]
all_servers = [
{'id': '1', 'name': 'Saeed1', 'addresses': {'External_Network': [{'addr': '1.1.1.1'}]}, 'plan': 'planA', 'status': 'suspended'},
{'id': '2', 'name': 'Saeed2', 'addresses': {'External_Network': [{'addr': '6.6.6.6'}]}, 'plan': 'planB', 'status': 'suspended'},
{'id': '3', 'name': 'Saeed3', 'addresses': {'External_Network': [{'addr': '3.3.3.3'}]}, 'plan': 'planG', 'status': 'active'},
{'id': '4', 'name': 'Saeed4', 'addresses': {}, 'plan': 'planC', 'status': 'active'},
{'id': '5', 'name': 'Saeed5', 'addresses': {'External_Network': [{'addr': '8.8.8.8'}]}, 'plan': 'planA', 'status': 'suspended'},
]
all_plans = [
{'name': 'planA', 'id': '124124124'},
{'name': 'planB', 'id': '124224124'},
{'name': 'planC', 'id': '164124124'},
{'name': 'planG', 'id': '174124124'},
]
tmp = []
final = []
for status in statuses:
for server in all_servers:
for plan in all_plans:
if status['id'] == server['id'] and status['id'] not in tmp:
tmp.append(status['id'])
if (status['plan_id'] != plan['id']) and (plan['name'] != server['plan']):
final.append({'name': status['name'], 'code': 'plan_mismatch'})
if 'External_Network' not in server['addresses']:
final.append({'name': server['name'], 'code': 'has no ip'})
else:
for addr in server['addresses']['External_Network']:
if addr['addr'] != status['ip']:
final.append({'name': status['name'], 'code': 'ip_mismatch'})
if status['status'] != server['status']:
final.append({'name': status['name'], 'code': 'status_mismatch'})
if status['name'] != server['name']:
final.append({'name': status['name'], 'code': 'names_mismatch'})
这是我现在的逻辑:
from `statuses` and `all_servers`, first check if `id` matches, then do this:
1) if `status['plan_id'] != plan['id']` and also `plan['name'] != all['plan']`, print plan_mismatch
2)+ if `status['name'] != all['name']`, print names_mismatch.
3)+ if status['ip'] != all['addresses']['External_Network']['addr'], print ip_mismatch.
4)+ if status['status'] != all['status'], print status_mismatch.
根据当前的 final
列表,这些问题本来不应该出现,但我不知道为什么:
- {'name': 'Saeed2', 'code': 'plan_mismatch'}
- {'name': 'Saeed4', 'code': 'plan_mismatch'}
应该打印出来的所有错误信息是这些:
- Saeed1 状态不匹配
- Saeed2 IP不匹配
- Saeed3 计划不匹配
- Saeed3 状态不匹配
- Saeed4 没有IP
- Saeed4 状态不匹配
- Saeed51 名称不匹配
- Saeed51 IP不匹配
- Saeed51 状态不匹配
1 个回答
1
现在,每个 status
和 server
只有在和第一个 plan
比较时,才会用到相同的 id
。
我们应该找到正确的 相关 plan
,然后进行比较:
statuses = [
{'id': '1', 'plan_id': '124124124', 'ip': '1.1.1.1', 'name': 'Saeed1', 'status': 'active'},
{'id': '2', 'plan_id': '124224124', 'ip': '2.2.2.2', 'name': 'Saeed2', 'status': 'suspended'},
{'id': '3', 'plan_id': '164124124', 'ip': '3.3.3.3', 'name': 'Saeed3', 'status': 'suspended'},
{'id': '4', 'plan_id': '164124124', 'ip': '4.4.4.4', 'name': 'Saeed4', 'status': 'suspended'},
{'id': '5', 'plan_id': '124124124', 'ip': '5.5.5.5', 'name': 'Saeed51', 'status': 'active'},
]
all_servers = [
{'id': '1', 'name': 'Saeed1', 'addresses': {'External_Network': [{'addr': '1.1.1.1'}]}, 'plan': 'planA', 'status': 'suspended'},
{'id': '2', 'name': 'Saeed2', 'addresses': {'External_Network': [{'addr': '6.6.6.6'}]}, 'plan': 'planB', 'status': 'suspended'},
{'id': '3', 'name': 'Saeed3', 'addresses': {'External_Network': [{'addr': '3.3.3.3'}]}, 'plan': 'planG', 'status': 'active'},
{'id': '4', 'name': 'Saeed4', 'addresses': {}, 'plan': 'planC', 'status': 'active'},
{'id': '5', 'name': 'Saeed5', 'addresses': {'External_Network': [{'addr': '8.8.8.8'}]}, 'plan': 'planA', 'status': 'suspended'},
]
all_plans = [
{'name': 'planA', 'id': '124124124'},
{'name': 'planB', 'id': '124224124'},
{'name': 'planC', 'id': '164124124'},
{'name': 'planG', 'id': '174124124'},
]
tmp = []
final = []
for status in statuses:
for server in all_servers:
if status['id'] == server['id'] and status['id'] not in tmp:
tmp.append(status['id'])
for plan in all_plans:
if plan['id'] == status['plan_id']:
if plan['name'] != server['plan']:
final.append({'name': status['name'], 'code': 'plan_mismatch'})
break
if 'External_Network' not in server['addresses']:
final.append({'name': server['name'], 'code': 'has no ip'})
else:
for addr in server['addresses']['External_Network']:
if addr['addr'] != status['ip']:
final.append({'name': status['name'], 'code': 'ip_mismatch'})
if status['status'] != server['status']:
final.append({'name': status['name'], 'code': 'status_mismatch'})
if status['name'] != server['name']:
final.append({'name': status['name'], 'code': 'names_mismatch'})
print('\n'.join([str(f) for f in final]))
输出:
{'name': 'Saeed1', 'code': 'status_mismatch'}
{'name': 'Saeed2', 'code': 'ip_mismatch'}
{'name': 'Saeed3', 'code': 'plan_mismatch'}
{'name': 'Saeed3', 'code': 'status_mismatch'}
{'name': 'Saeed4', 'code': 'has no ip'}
{'name': 'Saeed4', 'code': 'status_mismatch'}
{'name': 'Saeed51', 'code': 'ip_mismatch'}
{'name': 'Saeed51', 'code': 'status_mismatch'}
{'name': 'Saeed51', 'code': 'names_mismatch'}