Преобразовать строку с компонентами, разделенными символами, во вложенный словарь Python - PullRequest
0 голосов
/ 03 октября 2018

Я борюсь с вопросом по 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 голосов
/ 03 октября 2018

Возможно, существует более чистый и точный способ решения вашей проблемы, но сейчас вы можете справиться с этим.

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"
0 голосов
/ 03 октября 2018

Вы можете использовать следующее понимание 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'}}
0 голосов
/ 03 октября 2018

Я написал решение, которое может быть расширено и для других примеров.Я создал более сложный пример

Обратите внимание: у нас есть другой набор, разделенный ;.Если я смог продемонстрировать это для этого примера, он должен работать и для других

Важно отметить, что это будет работать, только если последние 2 символа в text равны "\n".Если "\n" отсутствует в последних двух символах, удалите строку list1.remove("")

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

Сначала я делю на \n, это будет означать, что будет присутствовать ""в списке, поскольку последние 2 символа text - это "\ 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'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...