简体   繁体   English

基于多个分隔符将字符串拆分为字典

[英]Split string to dictionary based on multiple delimiters

Problem:问题:

I get a cluster definition as a string.我得到一个作为字符串的集群定义。 The definition contains the IP, Port and Trunk details of two interconnected applications for one or more data centers.该定义包含一个或多个数据中心的两个互连应用程序的 IP、端口和中继详细信息。 The structure of the string is the following: Application1 IPs and Port details: 'N' number of IPs (minimum 2) and exactly 1 port.该字符串的结构如下: Application1 IPs and Port details:“N”个 IPs(最少 2 个)和正好 1 个端口。 IPs are separated with commas, while the port is separated with colon. IP 用逗号分隔,端口用冒号分隔。 Application1 config is closed with a semicolon, which is followed by Application2 IPs and trunks. Application1 配置以分号结尾,后跟 Application2 IP 和中继。 On Application 2 an IP and Trunk forms a single unit.在应用程序 2 上,IP 和中继构成一个单元。 These units are separated by colons while IP and Trunk information within the units are separated by '|'这些单元用冒号分隔,单元内的 IP 和中继信息用“|”分隔This is a sample input which contains the cluster definitions for 2 Data Centers.这是一个示例输入,其中包含 2 个数据中心的集群定义。

cluster_params = "1.1.1.1,2.2.2.2:5002;10.10.0.1|17,10.10.0.2|18,10.10.0.3|19,10.10.0.4|20\n3.3.3.3,4.4.4.4:5003;10.10.1.1|21,10.10.1.2|22,10.10.1.3|23,10.10.1.4|24"

What I need: I would like to split the cluster_params into a nested dictionary, something like the below sample:我需要什么:我想将 cluster_params 拆分为嵌套字典,类似于以下示例:

clusters = { 'Cluster1_App1_port_salt': ['App1_IP1', 'App1_IP2', 'App1_IPn'], 
              'App2_IPs_and_ports': ['App2_Ip1', 'App2_Port1','App2_Ip2', 'App2_Port2', 'App2_Ipn', 'App2_Portn'], 
              'Cluster2_App1_port_salt': ['App1_IP1', 'App1_IP2', 'App1_IPn'], 
              'App2_IPs_and_ports': ['App2_Ip1', 'App2_Port1','App2_Ip2', 'App2_Port2', 'App2_Ipn', 'App2_Portn'],} 

I can split and get the required variables from the string with the below code, but can't figure out how to put it into a nested dictionary.我可以使用以下代码从字符串中拆分并获取所需的变量,但不知道如何将其放入嵌套字典中。 (App1 is ICM and App2 is MPP in the below code) (在下面的代码中,App1 是 ICM,App2 是 MPP)

import string
import random
cluster_params = "1.1.1.1,2.2.2.2:5002;10.10.0.1|17,10.10.0.2|18,10.10.0.3|19,10.10.0.4|20\n3.3.3.3,4.4.4.4:5003;10.10.1.1|21,10.10.1.2|22,10.10.1.3|23,10.10.1.4|24"

clusters =cluster_params.split('\n')
for i in clusters:
    separate_cluster=i.split(';')
    icm_config=separate_cluster[0]
    mpp_config=separate_cluster[1]
    icm_separator=icm_config.split(':')
    icm_ips=icm_separator[0] 
    icm_port=icm_separator[1]
    salt=random.choice(string.ascii_lowercase)+random.choice(string.ascii_lowercase)+random.choice(string.ascii_lowercase)+random.choice(string.ascii_lowercase)
    PIM_Name='PIM_Connector_' + icm_port + '_' + salt  
    mpp_separator=mpp_config.split(',')
    mpp_ip=[]
    mpp_trunk=[]
    for i in mpp_separator:
        mpp_ip.append(i.split('|')[0])
        mpp_trunk.append(i.split('|')[1])

    print('ICM_Config: ' + icm_config)
    print('Pim_Name: ' + PIM_Name)
    print('ICM_IPs: ' + icm_ips)
    print('ICM_Port: ' + icm_port)
    print('ICM_IPs ' + icm_ips)
    print('MPP_Config: ' + mpp_config)
    print( mpp_ip)
    print( mpp_trunk)

Thanks!谢谢!

Check this out:看一下这个:

def salt():
    return "".join([random.choice(string.ascii_lowercase) for _ in range(4)])
apps_names = ["icm","mpp"]
clusters_dict = {}
for i,cluster in enumerate(cluster_params.split("\n")):
    salt_ = salt()
    icm,mpp = cluster.split(";")
    icm_ips,icm_port= icm.split(":")
    icm_ips=icm_ips.split(",")

    mpp_ips , mpp_trunks = [], []
    for entry in mpp.split(","):
        mpp_ip,mpp_trunk = entry.split("|")
        mpp_ips.append(mpp_ip)
        mpp_trunks.append(mpp_trunk)
    args_dict ={}
    args_dict["icm_"+str(icm_port)+"_"+salt_]=icm_ips
    args_dict["mpp_ips_and_ports"]=[mpp_ips[i]+"_"+mpp_trunks[i] for i in range(len(mpp_ips))]
    clusters_dict["cluster"+str(i+1)]=args_dict

print(clusters_dict)

output example :输出示例:

{'cluster1': {'icm_5002_phua': ['1.1.1.1', '2.2.2.2'], 'mpp_ips_and_ports': ['10.10.0.1_17', '10.10.0.2_18', '10.10.0.3_19', '10.10.0.4_20']}, 'cluster2': {'icm_5003_ppkg': ['3.3.3.3', '4.4.4.4'], 'mpp_ips_and_ports': ['10.10.1.1_21', '10.10.1.2_22', '10.10.1.3_23', '10.10.1.4_24']}}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM