Прежде всего, вы не можете напечатать строки сразу; лучше хранить данные (в виде кортежей) в списке (servers
). Чтобы сгруппировать сервисы по машине / группе / IP, вы можете использовать функцию itertools
groupby
, указав первые три поля в качестве кортежа ключей. (Перед этим список должен быть отсортирован, поэтому groupby
находит все дубликаты.) groupby
возвращает ключ (3-кортеж) и генератор для остальных соответствующих строк; здесь нас интересуют уникальные значения четвертого значения (службы), поэтому мы конвертируем значения в set
и соединяем их пробелами.
Проблема с выравниванием таблицы может быть решена с помощью функции string
ljust
(выравнивание по левому краю). Я сделал отдельную функцию, чтобы обобщить рендеринг строки заголовка и строк данных.
Вот код:
from itertools import groupby
servers = []
for AllConfigurations in yXML.getElementsByTagName('AllConfigurations'):
for DeployConfigurations in AllConfigurations.getElementsByTagName('DeployConfigurations'):
for Servers in DeployConfigurations.getElementsByTagName('Servers'):
for Group in Servers.getElementsByTagName('Group'):
for GApp in Group.getElementsByTagName('GApp'):
for Server in Group.getElementsByTagName('Server'):
servers.append((Server.getAttribute('name'),
Group.getAttribute('name'),
Server.getAttribute('ip'),
GApp.getAttribute('type')))
def line(machine, group, ip, services):
return " | ".join([machine.ljust(8), group.ljust(20), ip.ljust(15), services])
print line("Machine", "Group", "IP", "Services")
for server, services in groupby(sorted(servers), lambda server: server[0:3]):
print line("- " + server[0], server[1], server[2],
", ".join(service[3] for service in set(services)))
Это печатает
Machine | Group | IP | Services
- Alpha | Public Server Group | 192.168.1.251 | JBoss, Tomcat
- Public | Public Server Group | 192.168.1.253 | Tomcat, JBoss