我正在努力解决Python问题,希望能对您有所帮助。请耐心等待,我的Python目前是基础。
问题:
如何转换这样的字符串结构:
text="key1=value1;key2=value2\nkeyA=valueA\n..."
插入这样的Python字典中:
{0:{'key1':'value1', 'key2':'value2'}, 1:{'keyA':'valueA'}}
还需要另一个函数将此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'}
但是如何将字典中的这些值放入键,值结构中,如上所示?
答案 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'}}