Если мы можем предположить, что ваш ввод не выполняет никаких кавычек или экранирования (ваш пример не делает этого, но это не обязательно означает, что это хорошее предположение), и что вы никогда не сможете разделить запятую несколько ключей, только несколько значений (которые, вероятно, является хорошее предположение, так как в противном случае формат неоднозначна ...):
Во-первых, давайте опускать скобки, затем разделить на двоеточиями:
>>> A = "{user_id:34dd833,category:secondary,items:camera,vcr,dvd,type:sg_ser}"
>>> A[1:-1].split(':')
['user_id', '34dd833,category', 'secondary,items', 'camera,vcr,dvd,type', 'sg_ser']
Так первая запись - это первый ключ, последняя запись - e последнее значение (ы), и каждая запись между ними - это N-е значение (ы), за которым следует запятая, за которой следует N + 1-й ключ. Там могут быть и другие запятые, но последний всегда разделяет N-е значение (ы) с N + 1-го ключа. (И это даже работает для N = 0 - нет никаких запятых, поэтому последняя запятая ничего не отделяет от 0-го ключа, но, к сожалению, она не работает для самой последней записи. Я доберусь до этого позже.)
Есть способы, которыми мы могли бы сделать это краткое изложение, но давайте сначала напишем это явно как код, поэтому вы понимаете, как это работает.
>>> d = {}
>>> entries = A[1:-1].split(':')
>>> for i in range(len(entries)-1):
... key = entries[i].rpartition(',')[-1]
... value = entries[i+1].rpartition(',')[0]
... d[key] = value
Это почти сразу:
>>> d
{'category': 'secondary', 'items': 'camera,vcr,dvd', 'type': '', 'user_id': '34dd833'}
Как уже упоминалось выше, он не работает на последней. Это должно быть очевидно, почему; если нет, посмотрите, что возвращает rpartition(',')
за последнее значение. Вы можете исправить это вручную или просто обмануть, добавив дополнительно ,
на конец (entries = (A[1:-1] + ',').split(':')
). Но если вы думаете об этом, если вы просто rsplit
вместо rpartition
, то [0]
делает правильные вещи. Так что давайте сделаем это вместо этого.
Итак, как мы можем немного почистить это?
Сначала давайте преобразуем entries
в список смежных пар. Теперь каждая из каждой пары (n, nplus1)
, n.rpartition(',')[-1]
является ключевым, а nplus1.rsplit(',', 1)[0]
- соответствующее значение. Итак:
>>> A = "{user_id:34dd833,category:secondary,items:camera,vcr,dvd,type:sg_ser}"
>>> entries = A[1:-1].split(':')
>>> adjpairs = zip(entries, entries[1:])
>>> d = {k.rpartition(',')[-1]: v.rsplit(',', 1)[0] for k, v in adjpairs}
Какая ценности в том, что '34dd833' в предполагаемом выходе? Вы хотели поставить это в кавычки? Или префикс с 0x? Или что-то другое? – abarnert
ohh .. Извините .. это должна быть строка .. мне мне нужно изменить вопрос. – user2480542
Почему ваш ввод выглядит так? От куда это? Я почти уверен, что это недействительно JSON. – user2357112