Преобразование плоского словаря Python в список словарей - PullRequest
4 голосов
/ 15 октября 2011

У меня есть словарь в следующем формате, в котором я не знаю количество строк или элементов, которые я собираюсь получить:

{'line(0).item1':'a', 'line(0).item2':'34', 
 'line(1).item1':'sd', 'line(1).item2':'2', 'line(1).item3':'fg', 
 'line(2).item1':'f' ... }

Какой самый питонный способ разобрать это в список словарей в следующем формате:

[{'item1':'a', 'item2':'34'}, 
 {'item1':'sd', 'item2':'2', 'item3':'fg'}, 
 {'item1':'f',...}, ...]

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 15 октября 2011
d = {'line(0).item1':'a' ...}

out = collections.defaultdict(list)
for k,v in d.items():
    n,val = re.findall(r'^line\((\d+)\)\.(\w+)$', k)[0]
    out[int(n)].append((val,v))

my_list = [dict(out[v]) for v in sorted(out)]

и результат будет ожидаемым:

[{'item2': '34', 'item1': 'a'}, {'item2': '2', 'item3': 'fg', 'item1': 'sd'}, {'item1': 'f'}]
0 голосов
/ 15 октября 2011

Я бы выбрал промежуточный словарь словарей, поскольку нет способа узнать, сколько «строк» ​​у вас будет в конце, и вы не сможете вставить новый элемент в конец списка позже.

Это должно быть достаточно просто, чтобы перебрать каждый элемент в этом dict и разобрать его в номер строки и ключ. Затем вы можете легко перенести новый dict в нужный вам список. Возможная реализация может быть:

intermediate_dict = {}
for entry in my_dict:
    line_string, key = entry
    line_number = int(line_string[line_string.index('(') + 1: line_string.index(')')])
    if line_number not in intermediate_dict:
        intermediate_dict[line_number] = {}
    intermediate_dict[line_number][key] = my_dict[entry]

new_list = []
for i in xrange(len(intermediate_dict)):
    new_list.append(intermediate_dict[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...