将由符号分隔的组件转换为嵌套的python字典

时间:2018-10-03 11:00:31

标签: string python-3.x dictionary

我正在努力解决Python问题,希望能对您有所帮助。请耐心等待,我的Python目前是基础。


问题:

如何转换这样的字符串结构:

text="key1=value1;key2=value2\nkeyA=valueA\n..."

插入这样的Python字典中:

{0:{'key1':'value1', 'key2':'value2'}, 1:{'keyA':'valueA'}}
  1. 意识到那个';' 分隔内部词典中的项目,而'\ n'分隔外部词典中的项目。
  2. 内部字典中的键值是字符串。外字典的键是索引。

还需要另一个函数将此Python字典转换回其原始字符串形式。


我现在的位置:

我当时正在考虑创建一个能够执行此操作的循环,但是我正在努力创建它。

         a[0]["key1"]="value1"  
         a[0]["key2"]="value2"  
         a[1]["keyA"]="valueA"  

我所做的最好的事情是像这样用'\ n'分割字符串:

text ='k1=v1;k2=v2\nk3=v3\nk4=v4'
text = text.split("\n")

output: ['k1=v1;k2=v2', 'k3=v3', 'k4=v4']

并像这样将元素循环到字典中:

dic = {}
for i,x in enumerate(text):
    dic[i] = x

output: {0: 'k1=v1;k2=v2', 1: 'k3=v3', 2: 'k4=v4'}

但是如何将字典中的这些值放入键,值结构中,如上所示?

3 个答案:

答案 0 :(得分:2)

您可以使用以下dict理解:

{i: dict(p.split('=', 1) for p in l.split(';')) for i, l in enumerate(text.split('\n')) if l}

使用您的示例输入:

text="key1=value1;key2=value2\nkeyA=valueA\n"

这将返回:

{0: {'key1': 'value1', 'key2': 'value2'}, 1: {'keyA': 'valueA'}}

答案 1 :(得分:1)

也许有更干净,更精确的方法来解决问题,但现在,您可以使用此方法进行管理。

def make_dict(string):
    temp={}
    string=string.split(';')
    string=[i.split('=') for i in string]
    for a,b in string:
        temp[a]=b 
    return temp 

text ='k1=v1;k2=v2\nk3=v3\nk4=v4'
text=text.split('\n')
dic={}

for i,x in enumerate(text):
    dic[i] = make_dict(x)

>>> print(dic) 
>>> {0: {'k1': 'v1', 'k2': 'v2'}, 1: {'k3': 'v3'}, 2: {'k4': 'v4'}}

如果您想逆转以上过程,则可以通过以下方式完成。

def convert_again(dct):
    fetch_values = list(dct.values())

    change_values_to_list = [list(i.items()) for i in fetch_values]

    # add "=" in between the key-value pairs 
    for i in range(len(change_values_to_list)):
        for j in range(len(change_values_to_list[i])):
            change_values_to_list[i][j]='='.join(change_values_to_list[i][j])

    # Now add ";"
    answer = [';'.join(i) for i in change_values_to_list]
    # Now add "\n" 
    final_answer = '\\n'.join(answer)
    return final_answer

    #Driver Code

    dct= {0: {'k1': 'v1', 'k2': 'v2'}, 1: {'k3': 'v3'}, 2: {'k4': 'v4'}}
    print(convert_again(dct)) # --> "k1=v1;k2=v2\nk3=v3\nk4=v4"

答案 2 :(得分:0)

我已经写了一个可以扩展到其他示例的解决方案。 我创建了一个更复杂的示例

请注意,我们还有另一个;分隔的集合。如果我能在此示例中对其进行演示,那么它也应适用于其他人

请注意,只有在text中的最后2个字符为"\n"时,此方法才有效。如果最后两个字符中没有"\n",请删除行list1.remove("")

text="key3=value3;key4=value4\nkey1=value1;key2=value2\nkeyA=valueA\nkeyB=valueB\n"

我首先用\n进行拆分,这意味着列表中将出现"",因为text的后2个字符为“ \ n”

list1 = text.split("\n")
list1.remove("") 

现在,我正在创建两个列表,一个列表附加由";"分隔的字符串,另一个列表附加未由";"分隔的字符串

list2 = [] #Stuff seperated by ;
list3 = [] #Stuff not seperated by ;

for items in list1:

    if ';' in items:
        list2.append(items)

    else:
        list3.append(items)

我创建了一个空字典,最终有了您想要的东西

result_dict = {} #To store all key, value pairs

list2现在有['key3=value3;key4=value4', 'key1=value1;key2=value2']

#First storing key, value pairs seperated by ";"
for i in range(0, len(list2)):
    a = list2[i].split(";")
    result_dict[i] = dict(s.split('=') for s in a)

list3具有['keyA=valueA', 'keyB=valueB']

#Now storing key, value pairs not seperated by ";"
nosemicolon_dict = dict(s.split('=') for s in list3)

for key, value in nosemicolon_dict.items():
    for j in range(0, len(nosemicolon_dict)):
        result_dict[j + i + 1] = {key:value}

对于您的示例,运行上面的相同代码,将text替换为您的示例,同时确保考虑到"\n"是否是示例中的最后两个字符。如果您在字符串末尾没有"\n",请删除list1.remove("")此行

print(result_dict)

给我:

{0: {'key1': 'value1', 'key2': 'value2'}, 1: {'keyA': 'valueA'}}