String 将包含由符号分隔的组件的字符串转换为嵌套python字典
我正在努力解决一个Python问题,如果有任何帮助,我将不胜感激。一定要有耐心,我的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
问题: 如何转换如下所示的字符串结构:
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']
我现在的位置: 我曾想过创建一个能够做到这一点的循环,但我正在努力创建它
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中的值())
只要给定一个dictd
。如果你认为这个答案是正确的,你能把它标记为接受吗?(点击答案旁边的灰色复选标记。)@blhsing感谢您的及时回复。(1) 你有没有办法将这个过程从字典中倒转回原文?(2) 我意识到你在代码末尾用了“如果我”。我试着在没有它的情况下运行代码,效果很好。“如果我”有必要吗?PS:我删除了之前的评论,以补充第二点。感谢您的时间。如果字符串以\n
结尾,我的答案中的if l
是必需的,在这种情况下拆分('\n')
将返回一个列表,其中最后一项是'
,这不是我们想要处理的。你试过我上面评论中的反转代码了吗?这对你有用吗?反转效果很好。我仍然没有得到if l
部分。如果l
,您是否能够通过添加来解释为什么排除'
?谢谢。@Anonymous谢谢您花时间回答这个问题。作为一名python新手,我发现您对直觉的解释比@blhsing更直观。你有没有办法将这个过程从字典中倒转回原文?希望收到你的来信。我已经相应地修改了我的答案。我希望这能有所帮助