从Python列表中获取位置以生成动态范围

时间:2015-10-05 05:25:21

标签: python list

我有一个使用以下代码构建的列表:

def return_hosts():
    'return a list of host names'
    with open('./tfhosts') as hosts:
        return [host.split()[1].strip() for host in hosts]

tfhosts 的格式是hosts文件的格式,所以我正在做的是获取主机名部分并将其填充到模板中,到目前为止这是有效的。

我要做的是确保即使添加了更多主机,他们也会在其他主机部分被修复时被放入默认部分,但这部分我希望是动态的,这样做我得到了以下内容:

rendered_inventory = inventory_template.render({
        'host_main': gethosts[0],
        'host_master1': gethosts[1],
        'host_master2': gethosts[2],
        'host_spring': gethosts[3],
        'host_default': gethosts[4:],
})

除了host_default部分下的最后一个主机之外,所有内容都正确呈现,而不是获取新行分隔的主机列表,如下所示(这就是我想要的):

[host_default]
dc01-worker-02
dc01-worker-03

它只是在一个列表中写出剩余的主机名,因为(我不想要):

[host_default]
['dc01-worker-02', 'dc01-worker-03']

我试图包装主机默认部分并将其拆分,但如果我尝试,我会收到运行时错误:

[gethosts[4:].split(",").strip()...

1 个答案:

答案 0 :(得分:0)

我相信gethosts[4:]会返回一个列表,如果gethosts是一个列表(似乎就是这种情况),那么它就是直接将列表写入您的文件。

此外,您无法在列表中执行.split()(我猜您希望对字符串执行.split,但gethosts[4:]会返回一个列表。我相信一个简单的方法是使用str.join\n作为分隔符加入列表中的字符串。示例 -

rendered_inventory = inventory_template.render({
    'host_main': gethosts[0],
    'host_master1': gethosts[1],
    'host_master2': gethosts[2],
    'host_spring': gethosts[3],
    'host_default': '\n'.join(gethosts[4:]),
})

演示 -

>>> lst = ['dc01-worker-02', 'dc01-worker-03']
>>> print('\n'.join(lst))
dc01-worker-02
dc01-worker-03

如果您拥有该模板,则更简洁的方法是遍历host_default的列表并打印模板中的每个元素。例如,您可以尝试使用for loop construct in the jinja template