2014-01-15 4 views
0

я получаю через POST в юникод строку, как это:преобразовать строку unicode в массив. Django-Python

u'[<Word: colors>, <Word: red>, <Word: blue>, <Word: yellow>, <Word: green>, <Word: orange>, <Word: purple>, <Word: brown>, <Word: white>, <Word: black>, <Word: grey>]' 

Я хочу, чтобы это было массив или словарь, так что я могу работать с ним.

Как я могу это сделать?

Спасибо.

+0

Строка? ' "[<Слово: цвета>, , , <Слово: желтый>, <Слово: оранжевый>, <Слово: фиолетовый>, , , , ] "' – iMom0

+0

Да, это было первоначально список объектов, но, пройдя через HTML, он возвращается так же, но, будучи строкой unicode – Sascuash

+1

, я думаю, вы должны посмотреть на нее с другого конца и сделать так, чтобы строка, которую вы получили в POST, работайте с. – RemcoGerlich

ответ

0

Я думаю, что должен быть способ изменить формат ваших данных (потому что, как я вижу, вы пытаетесь вывести список объектов python для формирования поля, что не является хорошей идеей).

Без дополнительной информации о вашем коде, я могу предложить следующее:

выхода для полевой формы 'colors,red,blue,yellow...'

затем после поста: list_of_values = input.split(',') (где ввод получил строку из поста)

Также вы можете использовать этот код основан на том, какой результат вам нужен

print map(lambda val: val.strip(' <>'), s.strip('[]').split(',')) 
print map(lambda val: val.strip(' <>').split(':')[1].strip(), s.strip('[]').split(',')) 

Также вы можете сериализовать или распиливать данные.

+0

Этот подход сломается, если элементы содержат «плохие символы», например, < > и т. Д. – user3159253

+0

@ user3159253, yep! Это только вариант решения и, конечно, он не охватывает все возможные варианты данных. Лучший способ ИМХО - изменить формат почтовых данных. –

+1

Ну, как я уже упоминал выше, структурированный текст (особенно с такой простой грамматикой) должен анализироваться, как структурированный текст, а не только последовательность символов. Явно написанная грамматика спасет вас от часов отладки, если в итоге все изменится. Любой из разделов «разделим его на разделители» или «давайте использовать простой RE» не продолжим. – user3159253

2

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

 
import pyparsing as pp 

s = u'[<Word: colors>, <Word: red>, <Word: blue>, <Word: yellow>, <Word: green>, <Word: orange>, <Word: purple>, <Word: brown>, <Word: white>, <Word: black>, <Word: grey>]' 

term = pp.Literal('<') + pp.Literal('Word') + pp.Literal(':') + pp.Word(pp.alphas) + pp.Literal('>') 
expr = pp.Literal('[') + term + pp.ZeroOrMore(pp.Literal(',') + term) + pp.Literal(']') 

r = expr.parseString(s) 

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

 
import pyparsing as pp 

s = u'[<Word: colors>, <Word: red>, <Word: blue>, <Word: yellow>, <Word: green>, <Word: orange>, <Word: purple>, <Word: brown>, <Word: white>, <Word: black>, <Word: grey>]' 

colors = [] 

term = pp.Literal('<') + pp.Literal('Word') + pp.Literal(':') + pp.Word(pp.alphas).setParseAction(lambda s: colors.append(s[0])) + pp.Literal('>') 
expr = pp.Literal('[') + term + pp.ZeroOrMore(pp.Literal(',') + term) + pp.Literal(']') 

r = expr.parseString(s) 

colors Теперь содержит список цветов и так далее ...

Смежные вопросы