Este é o meu código:
from collections import defaultdict
ip_port_device = [
{'ip': '192.168.1.140', 'port_number': 4, 'device_name': 'device1'},
{'ip': '192.168.1.128', 'port_number': 8, 'device_name': 'device1'},
{'ip': '192.168.1.56', 'port_number': 14, 'device_name': 'device1'},
{'ip': '192.168.1.61', 'port_number': 4, 'device_name': 'device1'},
{'ip': '192.168.1.78', 'port_number': 8, 'device_name': 'device1'},
{'ip': '192.168.1.13', 'port_number': 16, 'device_name': 'device1'},
{'ip': '192.168.2.140', 'port_number': 4, 'device_name': 'device2'},
{'ip': '192.168.2.128', 'port_number': 8, 'device_name': 'device2'},
{'ip': '192.168.2.56', 'port_number': 14, 'device_name': 'device2'},
{'ip': '192.168.2.61', 'port_number': 4, 'device_name': 'device2'},
{'ip': '192.168.2.78', 'port_number': 8, 'device_name': 'device2'},
{'ip': '192.168.2.13', 'port_number': 16, 'device_name': 'device2'},
{'ip': '192.168.3.140', 'port_number': 4, 'device_name': 'device3'},
{'ip': '192.168.3.128', 'port_number': 8, 'device_name': 'device3'},
{'ip': '192.168.3.56', 'port_number': 14, 'device_name': 'device3'},
{'ip': '192.168.3.61', 'port_number': 4, 'device_name': 'device3'},
{'ip': '192.168.3.78', 'port_number': 8, 'device_name': 'device3'},
{'ip': '192.168.3.13', 'port_number': 16, 'device_name': 'device3'},
]
ip_per_node = [
{'node_name': 'server9.example.com', 'ip_address': '192.168.1.140'},
{'node_name': 'server19.example.com', 'ip_address': '192.168.1.128'},
{'node_name': 'server11.example.com', 'ip_address': '192.168.2.140'},
{'node_name': 'server21.example.com', 'ip_address': '192.168.2.128'},
{'node_name': 'server17.example.com', 'ip_address': '192.168.3.140'},
{'node_name': 'server6.example.com', 'ip_address': '192.168.3.128'},
]
ips_and_ports_in_switch = []
for compute in ip_per_node:
for port in ip_port_device:
if compute['ip_address'] == port['ip']:
port = port['port_number']
for new_port in ip_port_device:
if port == new_port['port_number']:
ips_and_ports_in_switch.append({
'port_number': new_port['port_number'],
'ip_address': new_port['ip'],
'node_name': compute['node_name'],
'device_name': new_port['device_name']
})
concatenated = defaultdict(list)
for entry in ips_and_ports_in_switch:
concatenated[(entry['device_name'], entry['port_number'], entry['node_name'])].append(entry['ip_address'])
A lógica é:
se ip_per_node['ip_address']
corresponder ip_port_device['ip']
, então em ip_port_device
find todos os ips terão o mesmo número de porta.
Em seguida, salve assim (resultado esperado):
node server9.example.com, port 4, device device1, ips ['192.168.1.140', '192.168.1.61']
node server19.example.com, port 8, device device1, ips ['192.168.1.128', '192.168.1.78']
node server11.example.com, port 4, device device2, ips ['192.168.2.140', '192.168.2.61']
node server21.example.com, port 8, device device2, ips ['192.168.2.128', '192.168.2.78']
node server17.example.com, port 4, device device3, ips ['192.168.3.140', '192.168.3.61']
node server6.example.com, port 8, device device3, ips ['192.168.3.128', '192.168.3.78']
Meu código atual não funciona como esperado. Ele salva uma porta várias vezes para todos os nós.
Tentei adicionar menos dados, mas necessários, para a amostra.
As modificações necessárias para que ele produza os resultados esperados são as seguintes (os comentários com Booboo são as principais alterações feitas em seu código)
Impressões: