Django, Python: Есть ли простой способ преобразования ключей POST в стиле PHP в многомерный dict?

В частности, я получил форму, которая вызывает службу Django (написанную с использованием Piston, но я не думаю, что это релевантно), отправляя через POST что-то вроде этого:

edu_type[3][name] => a edu_type[3][spec] => b edu_type[3][start_year] => c edu_type[3][end_year] => d edu_type[4][0][name] => Cisco edu_type[4][0][spec] => CCNA edu_type[4][0][start_year] => 2002 edu_type[4][0][end_year] => 2003 edu_type[4][1][name] => fiju edu_type[4][1][spec] => briju edu_type[4][1][start_year] => 1234 edu_type[4][1][end_year] => 5678 

Я хотел бы обработать это на конце Python, чтобы получить что-то вроде этого:

 edu_type = { '3' : { 'name' : 'a', 'spec' : 'b', 'start_year' : 'c', end_year : 'd' }, '4' : { '0' : { 'name' : 'Cisco', 'spec' : 'CCNA', 'start_year' : '2002', 'end_year' : '2003' }, '1' : { 'name' : 'fiju', 'spec' : 'briju', 'start_year' : '1234', 'end_year' : '5678' }, }, } 

Есть идеи? Благодаря!

Я сделал небольшой парсер в python для обработки многомерных dicts, вы можете найти его на https://github.com/bernii/querystring-parser

Dottedish делает что-то вроде того, что вы хотите. http://pypi.python.org/pypi/dottedish . У него действительно нет домашней страницы, но вы можете установить ее из pypi или загрузить источник из github.

 >>> import dottedish >>> dottedish.unflatten([('3.name', 'a'), ('3.spec', 'b')]) {'3': {'name': 'a', 'spec': 'b'}} 

Я еду от предыдущего ответа Atli об использовании json_encode PHP …

Питон-диктатор в своей основной форме синтаксически идентичен JSON. Вы могли бы легко выполнить eval() в структуре JSON, чтобы создать Python dict:

 >>> blob = """{ ... '3' : { 'name' : 'a', 'spec' : 'b', 'start_year' : 'c', 'end_year' : 'd' }, ... '4' : { ... '0' : { 'name' : 'Cisco', 'spec' : 'CCNA', 'start_year' : '2002', 'end_year' : '2003' }, ... '1' : { 'name' : 'fiju', 'spec' : 'briju', 'start_year' : '1234', 'end_year' : '5678' }, ... }, ... }""" >>> edu_type = eval(blob) >>> edu_type {'3': {'end_year': 'd', 'start_year': 'c', 'name': 'a', 'spec': 'b'}, '4': {'1': {'end_year': '5678', 'start_year': '1234', 'name': 'fiju', 'spec': 'briju'}, '0': {'end_year': '2003', 'start_year': '2002', 'name': 'Cisco', 'spec': 'CCNA'}}} 

Теперь, это лучший способ? Возможно нет. Но он работает и не прибегает к регулярным выражениям, которые могут быть технически лучше, но, безусловно, это не более быстрый вариант, учитывая время отладки и устранения неполадок с вашим шаблоном.

JSON – хороший формат для межстраничной передачи данных.

Python также имеет модуль json как часть стандартной библиотеки. В то время как это более разборчиво в отношении вывода, который вы анализируете, это, безусловно, лучший способ сделать это (хотя и с большей работой).

хорошо, так что это гетто, как черт, но здесь идет:

скажем, ваш вход – это список кортежей. say: input = [('edu_type [3] [end_year]', 'd'), …]

 from collections import defaultdict from re import compile def defdict(): return defaultdict(defdict) edu_type = defdict() inputs = [(x.replace('[', '["').replace(']', '"]'), y) for x, y in input] for input in inputs: exec = '%s = "%s"' % input 

Обратите внимание, что вы должны использовать это только в том случае, если доверяете источнику ввода, поскольку он не находится рядом с безопасным.