сделать 2D dict из dict python, разделив ключи с помощью регулярного выражения - PullRequest
0 голосов
/ 30 октября 2018

У меня есть диктовка, которая выглядит так:

{'word1/AB': 1,
 'word2/AB': 2,
 'word3/CD': 1,
 'word4/EF': 1,
 'word5/GH': 1}

И мне нужно закончить двумерным диктом, который выглядит следующим образом:

{'word1':{'AB': 1},
 'word2':{'AB': 2},
 'word3':{'CD': 1},
 'word4':{'EF': 1},
 'word5':{'GH': 1}}

Мое регулярное выражение для разделения ключа: "[a-zA-Z]*[^\/]"

Но я совершенно ошеломлен тем, как это сделать. Я считаю, что мне нужно перебрать диктовку, разделить ключ на две строки и создать новый диктат, используя {str1: {str2: оригинальное значение dict}}, но мои знания о диктовках, нарезке и т. Д. Потрепаны, и я не могу поставить свои мысли в коде.

Не могли бы вы помочь определить, какие "инструменты" мне нужны для этого?

Редактировать: Я полностью забыл о .split (), однако это был не самый важный аспект вопроса. Спасибо всем, что напомнили мне, хотя!

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Вы можете разделить клавиши с помощью str.split ('/'). Этот однострочник будет работать:

db = {'word1/AB': 1, 'word2/AB': 2, 'word3/CD': 1, 'word4/EF': 1, 'word5/GH': 1}

{ k.split('/')[0]: {k.split('/')[1]: db[k]}  for k in db.keys()}
0 голосов
/ 30 октября 2018

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

>>> d = {'word1/AB': 1,
...: 'word2/AB': 2,
...: 'word3/CD': 1,
...: 'word4/EF': 1,
...: 'word5/GH': 1}
...: 
>>> result = {}
>>> for k, v in d.items():
...:     k_outer, k_inner = k.split('/')
...:     result[k_outer] = {k_inner:v}
...:     
>>> result
>>> 
{'word1': {'AB': 1},
 'word2': {'AB': 2},
 'word3': {'CD': 1},
 'word4': {'EF': 1},
 'word5': {'GH': 1}}
0 голосов
/ 30 октября 2018

Если вы хотите разбить регулярное выражение, вы можете использовать re.split(regex, stringToSplit):

import re
dict = {'word1/AB': 1, 'word2/AB': 2,'word3/CD': 1,'word4/EF': 1,'word5/GH': 1}
dict2d = {}
for key in dict:
    values = re.split("\/", key);
    dict2d[values[0]] = {values[1]:dict[key]}
print dict2d

Выход

{'word5': {'GH': 1}, 'word4': {'EF': 1}, 'word1': {'AB': 1}, 'word3': {'CD': 1}, 'word2': {'AB': 2}}

Однако, для того, чего вы хотите достичь, я считаю, что key.split("\/") будет более чем достаточно

0 голосов
/ 30 октября 2018

Вы можете использовать str.split:

d = {'word1/AB': 1, 'word2/AB': 2, 'word3/CD': 1, 'word4/EF': 1, 'word5/GH': 1}
new_data = {tuple(a.split('/')):b for a, b in d.items()}
final_result = {a:{b:c} for [a, b], c in new_data.items()}

Выход:

{'word1': {'AB': 1}, 'word2': {'AB': 2}, 'word3': {'CD': 1}, 'word4': {'EF': 1}, 'word5': {'GH': 1}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...