Python разбирает строку как словарь - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть следующая строка:

"[['Categories', [['180972'], ['180800'], ['16228'], ['32733'], ['32789'], ['32833'], ['325137'], ['32839'], ['25329'], ['42605'], ['428240849'], ['5101'], ['568'], ['570716'], ['57116'], ['57080545404'], ['57083134076']]], ['Tags', ['Stock', 'Color', 'Fam', 'Dress','Maxi']], ['Type', ['Luxary']], ['Vendor', ['AAA']]]"

И я хочу разобрать ее как dict / json.Каков наилучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Вы можете использовать ast.literal_eval для оценки строки и возврата объекта Python (если синтаксис правильный). Использовать это безопаснее, чем eval.

import ast

s = "[['Categories', [['180972'], ['180800'], ['16228'], ['32733'], ['32789'], ['32833'], ['325137'], ['32839'], ['25329'], ['42605'], ['428240849'], ['5101'], ['568'], ['570716'], ['57116'], ['57080545404'], ['57083134076']]], ['Tags', ['Stock', 'Color', 'Fam', 'Dress','Maxi']], ['Type', ['Luxary']], ['Vendor', ['AAA']]]"

l = ast.literal_eval(s)
d = dict(l)
{'Categories': [['180972'],
  ['180800'],
  ['16228'],
  ['32733'],
  ['32789'],
  ['32833'],
  ['325137'],
  ['32839'],
  ['25329'],
  ['42605'],
  ['428240849'],
  ['5101'],
  ['568'],
  ['570716'],
  ['57116'],
  ['57080545404'],
  ['57083134076']],
 'Tags': ['Stock', 'Color', 'Fam', 'Dress', 'Maxi'],
 'Type': ['Luxary'],
 'Vendor': ['AAA']}

Если вы также хотите избавиться от внутреннего списка, используйте другой ответ вместопросто вызываю dict на объекте.

0 голосов
/ 26 декабря 2018

Как насчет этого

>>> import itertools
>>> import ast
>>> import pprint
>>> i = ast.literal_eval(s)
>>> d = {k[0]:list(itertools.chain(*k[1])) if isinstance(k[1][0], list) else list(k[1]) for k in i}
>>> pprint.pprint(d)
{'Categories': ['180972',
                '180800',
                '16228',
                '32733',
                '32789',
                '32833',
                '325137',
                '32839',
                '25329',
                '42605',
                '428240849',
                '5101',
                '568',
                '570716',
                '57116',
                '57080545404',
                '57083134076'],
 'Tags': ['Stock', 'Color', 'Fam', 'Dress', 'Maxi'],
 'Type': ['Luxary'],
 'Vendor': ['AAA']}
0 голосов
/ 26 декабря 2018

Попробуйте преобразовать его в dict:

data= "[['Categories', [['180972'], ['180800'], ['16228'], ['32733'], ['32789'], ['32833'], ['325137'], ['32839'], ['25329'], ['42605'], ['428240849'], ['5101'], ['568'], ['570716'], ['57116'], ['57080545404'], ['57083134076']]], ['Tags', ['Stock', 'Color', 'Fam', 'Dress','Maxi']], ['Type', ['Luxary']], ['Vendor', ['AAA']]]"

data = eval(data)

d={}
for i in data:
    d[i[0]] = [x for x, in i[1]] if isinstance(i[1][0], list) else i[1]

Вывод будет:

{'Categories': 
  ['180972',
   '180800',
   '16228',
   '32733',
   '32789',
   '32833',
   '325137',
   '32839',
   '25329',
   '42605',
   '428240849',
   '5101',
   '568',
   '570716',
   '57116',
   '57080545404',
   '57083134076'],
 'Tags': ['Stock', 'Color', 'Fam', 'Dress', 'Maxi'],
 'Type': ['Luxary'],
 'Vendor': ['AAA']
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...