Python中不同列表的for循环输出错误

-1 投票
1 回答
57 浏览
提问于 2025-04-14 18:37

这是我的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 列表,这些问题本来不应该出现,但我不知道为什么:

  1. {'name': 'Saeed2', 'code': 'plan_mismatch'}
  2. {'name': 'Saeed4', 'code': 'plan_mismatch'}

应该打印出来的所有错误信息是这些:

  1. Saeed1 状态不匹配
  2. Saeed2 IP不匹配
  3. Saeed3 计划不匹配
  4. Saeed3 状态不匹配
  5. Saeed4 没有IP
  6. Saeed4 状态不匹配
  7. Saeed51 名称不匹配
  8. Saeed51 IP不匹配
  9. Saeed51 状态不匹配

1 个回答

1

现在,每个 statusserver 只有在和第一个 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'}

撰写回答