<p>首先,不能立即打印行;而是将数据(作为元组)存储在列表(<code>servers</code>)中。要按machine/group/IP对服务进行分组,可以使用<code>itertools</code>函数<code>groupby</code>,将前三个字段指定为键元组。(在此之前,必须对列表进行排序,以便<code>groupby</code>查找所有重复项。)<code>groupby</code>生成键(3元组)和其余相应行的生成器;这里,我们对第四个值(服务)的唯一值感兴趣,因此我们将这些值转换为<code>set</code>,并用空格将它们连接起来。在</p>
<p>通过使用<code>string</code>函数<code>ljust</code>(左对齐)可以解决对齐表的问题。我创建了一个单独的函数来概括标题行和数据行的呈现。在</p>
<p>代码如下:</p>
<pre><code>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)))
</code></pre>
<p>这个指纹</p>
^{pr2}$