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

String 将包含由符号分隔的组件的字符串转换为嵌套python字典,string,python-3.x,dictionary,String,Python 3.x,Dictionary,我正在努力解决一个Python问题,如果有任何帮助,我将不胜感激。一定要有耐心,我的Python目前是基本的 问题: 如何转换如下所示的字符串结构: text="key1=value1;key2=value2\nkeyA=valueA\n..." {0:{'key1':'value1', 'key2':'value2'}, 1:{'keyA':'valueA'}} text ='k1=v1;k2=v2\nk3=v3\nk4=v4' text = text.split("\n") outp

我正在努力解决一个Python问题,如果有任何帮助,我将不胜感激。一定要有耐心,我的Python目前是基本的


问题:

如何转换如下所示的字符串结构:

text="key1=value1;key2=value2\nkeyA=valueA\n..."
{0:{'key1':'value1', 'key2':'value2'}, 1:{'keyA':'valueA'}}
text ='k1=v1;k2=v2\nk3=v3\nk4=v4'
text = text.split("\n")

output: ['k1=v1;k2=v2', 'k3=v3', 'k4=v4']
进入Python字典,如下所示:

text="key1=value1;key2=value2\nkeyA=valueA\n..."
{0:{'key1':'value1', 'key2':'value2'}, 1:{'keyA':'valueA'}}
text ='k1=v1;k2=v2\nk3=v3\nk4=v4'
text = text.split("\n")

output: ['k1=v1;k2=v2', 'k3=v3', 'k4=v4']
  • 认识到“;”分隔内部字典中的项,而“\n”分隔外部字典中的项
  • 内部字典中的键、值是字符串。外部字典的键是索引
  • 需要另一个函数将此Python字典转换回其原始字符串形式


    我现在的位置:

    我曾想过创建一个能够做到这一点的循环,但我正在努力创建它

             a[0]["key1"]="value1"  
             a[0]["key2"]="value2"  
             a[1]["keyA"]="valueA"  
    
    我所做的最好的操作是将字符串按“\n”拆分,如下所示:

    text="key1=value1;key2=value2\nkeyA=valueA\n..."
    
    {0:{'key1':'value1', 'key2':'value2'}, 1:{'keyA':'valueA'}}
    
    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'}
    

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

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

    注意,我们有另一个集合,由
    分隔。如果我能在这个例子中演示它,它也应该适用于其他人

    需要注意的是,只有当
    文本中的最后两个字符为
    “\n”
    时,此操作才有效。如果
    “\n”
    在最后两个字符中不存在,则删除行
    列表1。删除(“”

    我首先用
    \n
    进行拆分,这意味着列表中会出现一个
    ,因为
    文本的最后两个字符是“\n”

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

    我创建了一个空字典,最终得到了您想要的:

    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}
    
    对于您的示例,运行上面相同的代码,用示例替换
    文本
    ,同时确保考虑
    “\n”
    是否是示例中的最后两个字符。如果字符串末尾没有
    “\n”
    ,请删除
    列表1。删除(“”
    此行

    print(result_dict)
    
    给我:

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

    也许有一个更干净、更精确的方法来解决你的问题,但现在,你可以用这个方法来解决

    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"
    

    您可以使用以下听写理解:

    {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'}}
    

    我羡慕你们10万以上的代表,他们带着最不冗长的代码进来,很高兴能帮上忙<代码>“\n”.join(“;”.join(“=”.join(i)表示s.items()中的i)表示s.d中的值())
    只要给定一个dict
    d
    。如果你认为这个答案是正确的,你能把它标记为接受吗?(点击答案旁边的灰色复选标记。)@blhsing感谢您的及时回复。(1) 你有没有办法将这个过程从字典中倒转回原文?(2) 我意识到你在代码末尾用了“如果我”。我试着在没有它的情况下运行代码,效果很好。“如果我”有必要吗?PS:我删除了之前的评论,以补充第二点。感谢您的时间。如果字符串以
    \n
    结尾,我的答案中的
    if l
    是必需的,在这种情况下
    拆分('\n')
    将返回一个列表,其中最后一项是
    '
    ,这不是我们想要处理的。你试过我上面评论中的反转代码了吗?这对你有用吗?反转效果很好。我仍然没有得到
    if l
    部分。如果l
    ,您是否能够通过添加
    来解释为什么排除
    '
    ?谢谢。@Anonymous谢谢您花时间回答这个问题。作为一名python新手,我发现您对直觉的解释比@blhsing更直观。你有没有办法将这个过程从字典中倒转回原文?希望收到你的来信。我已经相应地修改了我的答案。我希望这能有所帮助