2017-04-23 92 views
0

我想借此輸入字符串如的Jinja2:字符串分割爲多個列表

"server1:port1,server2:port2,server3:port3" 

,並把它分割成2所列出:

servers = [ server1, server2, server3 ] 
ports = [ port1, port2, port3 ] 

有兩個分隔符通過這裏分裂:首先是「,」,然後元素本身被「:」分割。

有沒有快速的方法來做到這一點?

另外,如何將任何列表「toString」變成類似 portString =「port1,port2,port3」的東西?

+0

謝謝你們在Python中的答案。非常感激!現在我需要更多的Jinja2解決方案。 – igorT

回答

1

,如果你想這樣做在你的神社的模板,那麼你可以使用下面的代碼。

{% set server = [] %} 
    {% set port = [] %} 
    {% set x= "server1:port1,server2:port2,server3:port3" %} 
    {% for i in x.split(',') %} 
     {% for j in i.split(':') %} 
      {% set server = server + j[0] %} 
      {% set port = port + j[1] %} 
     {% endfor %} 
    {% endfor %} 

但在模板中這是一個非常糟糕的主意。它更好,如果你把它作爲字典傳遞到你的模板,然後像這樣使用它

{% for k,v in x.iteritems() %} 
#use k as server and v as port 
1

使用列表理解和join函數來實現這一點。

>>> a ="server1:port1,server2:port2,server3:port3" 
>>> temp = [i.split(':') for i in a.split(',')] 
>>> temp 
[['server1', 'port1'], ['server2', 'port2'], ['server3', 'port3']] 

>>> servers = [i[0] for i in temp] 
>>> ports = [i[1] for i in temp] 
>>> servers 
['server1', 'server2', 'server3'] 
>>> ports 
['port1', 'port2', 'port3'] 
>> ','.join(ports) 
port1,port2,port3  
0

的另一種方式,以實現所需的輸出:

def denormalize_addr_str(addr_str): 
    return reduce(lambda denorm_list, addr: denorm_list + addr.split(':'), addr_str.split(','), []) 

addr_str = "server1:port1,server2:port2,server3:port3" 

denorm_addr_str = denormalize_addr_str(addr_str) 
servers = denorm_addr_str[::2] 
ports = denorm_addr_str[::-2] 
port_string = ','.join(ports)