В Python, как я могу изменить значения словаря из строк в словари? - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть словарь в форме: d={741178: u'{"width":37.8365,"height":150,"length":234},{"width":35.7,"height":178,"length":122}',741179: u'{"width":98.67,"height":180,"length":994},{"width":98.79,"height":167.8,"length":154.22}'}

Как я могу превратить его в словарь словарей?Я пытался:

for k, v in d.items():
    v = ast.literal_eval(v)

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

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Я исправил json и удалил ненужные двойные кавычки и запятые. Если вы хотите иметь словарь в качестве значений, вы должны иметь значения в виде массива словарей.

import json    
d={741178:
       u'{"width":37.8365,"height":150,"length":234},'
       u'{"width":35.7,"height":178,"length":122}',
   741179: u'{"width":98.67,"height":180,"length":994},'
           u'{"width":98.79,"height":167.8,"length":154.22}'

   }
for key, value in d.items():
    d[key]= json.loads('['+value+']')
print(d)
0 голосов
/ 23 февраля 2019

Вы можете использовать ast.literal_eval() или json.loads(), в этом случае выходной сигнал практически одинаков.Для JSON вы должны заключить строки в квадратные скобки, потому что они оба содержат два словаря, разделенных запятой, поэтому единственный разумный способ получить их - это список словарей.Для литералов Python исключение квадратных скобок (или замена их скобками) приводит к тому, что каждая пара словарей, разделенных запятой, интерпретируется как 2-кортеж (должен быть двойным, но это уже имеет другое значение).

Я лично рекомендую использовать json.loads(), потому что JSON в настоящее время является наиболее используемым форматом для обмена данными в новых проектах.Было бы лучше, если бы источник ваших строк мог добавить квадратные скобки, чтобы получить действительный JSON.

import ast
import json

d = {741178: u'{"width":37.8365,"height":150,"length":234},{"width":35.7,"height":178,"length":122}',
     741179: u'{"width":98.67,"height":180,"length":994},{"width":98.79,"height":167.8,"length":154.22}'}

p = {k: ast.literal_eval(v)   for k, v in d.items()}
j = {k: json.loads('['+v+']') for k, v in d.items()}

print(p)
print(j)

# {741178: ({'width': 37.8365, 'height': 150, 'length': 234}, {'width': 35.7, 'height': 178, 'length': 122}), 741179: ({'width': 98.67, 'height': 180, 'length': 994}, {'width': 98.79, 'height': 167.8, 'length': 154.22})}
# {741178: [{'width': 37.8365, 'height': 150, 'length': 234}, {'width': 35.7, 'height': 178, 'length': 122}], 741179: [{'width': 98.67, 'height': 180, 'length': 994}, {'width': 98.79, 'height': 167.8, 'length': 154.22}]}

Как видите, единственная разница - ( )[ ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...