Как создать словарь Python с двойными кавычками в качестве формата котировки по умолчанию?
Я пытаюсь создать словарь python, который должен использоваться как java script var внутри html файла для целей визуализации. В качестве реквизита я нуждаюсь в создании словаря со всеми именами внутри двойных кавычек, а не по умолчанию для одиночных кавычек, которые использует Python. Есть ли простой и элегантный способ достичь этого.
couples = [
['jack', 'ilena'],
['arun', 'maya'],
['hari', 'aradhana'],
['bill', 'samantha']]
pairs = dict(couples)
print pairs
Сгенерированный вывод:
{'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
Ожидаемый результат:
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Я знаю, что json.dumps(pairs)
выполняет задание, но словарь в целом преобразуется в строку, которая не является тем, что я ожидаю.
P.S.: Есть ли альтернативный способ сделать это с помощью json, так как я имею дело со вложенными словарями.
Ответы
Ответ 1
Вы можете создать свою собственную версию dict со специальной печатью с помощью json.dumps()
:
>>> import json
>>> class mydict(dict):
def __str__(self):
return json.dumps(self)
>>> couples = [['jack', 'ilena'],
['arun', 'maya'],
['hari', 'aradhana'],
['bill', 'samantha']]
>>> pairs = mydict(couples)
>>> print pairs
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Вы также можете выполнить итерацию:
>>> for el in pairs:
print el
arun
bill
jack
hari
Ответ 2
json.dumps()
- это то, что вы хотите здесь, если вы используете print json.dumps(pairs)
, вы получите ожидаемый результат:
>>> pairs = {'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
>>> print pairs
{'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
>>> import json
>>> print json.dumps(pairs)
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Ответ 3
Вот базовая версия print
:
>>> print '{%s}' % ', '.join(['"%s": "%s"' % (k, v) for k, v in pairs.items()])
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Ответ 4
Посылка вопроса неверна:
I know, json.dumps(pairs) does the job, but the dictionary
as a whole is converted into a string which isn't what I am expecting.
Вы должны ожидать преобразования в строку. Все "print" does - это преобразование объекта в строку и отправка его на стандартный вывод.
Когда Python видит:
print somedict
Что он действительно делает:
sys.stdout.write(somedict.__str__())
sys.stdout.write('\n')
Как вы можете видеть, dict всегда преобразуется в строку (после того, как строка является единственным типом данных, который вы можете отправить в файл, например, stdout).
Управление преобразованием в строку может быть выполнено либо путем определения __str__ для объекта (как это сделали другие респонденты), либо путем вызова довольно печатной функции, такой как json.dumps()
. Хотя оба способа имеют одинаковый эффект при создании печатаемой строки, последний способ имеет много преимуществ (вам не нужно создавать новый объект, он рекурсивно применяется к вложенным данным, он является стандартным, он написан на C для скорость, и она уже хорошо протестирована).
В постскриптуме все еще не хватает точки:
P.S.: Is there an alternate way to do this with using json, since I am
dealing with nested dictionaries.
Зачем так много работать, чтобы избежать использования json-модуля? Практически любое решение проблемы печати вложенных словарей с двойными кавычками будет заново изобретено то, что уже делает json.dumps().
Ответ 5
# do not use this until you understand it
import json
class doubleQuoteDict(dict):
def __str__(self):
return json.dumps(self)
def __repr__(self):
return json.dumps(self)
couples = [
['jack', 'ilena'],
['arun', 'maya'],
['hari', 'aradhana'],
['bill', 'samantha']]
pairs = doubleQuoteDict(couples)
print pairs
Урожайность:
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Ответ 6
Проблема, возникшая мною несколько раз, заключается в загрузке json файла.
import json
with open('json_test.json', 'r') as f:
data = json.load(f)
print(type(data), data)
json_string = json.dumps(data)
print(json_string)
Я случайно передаю данные некоторой функции, которая хочет строку json, и я получаю ошибку, что одиночная кавычка недействительна json. Я перепроверяю входной файл json и вижу двойные кавычки, а затем царапаю голову на минуту.
Проблема заключается в том, что данные - это не строка, а когда Python преобразует ее для вас, она НЕ действует json.
<class 'dict'> {'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana', 'arun': 'maya'}
{"bill": "samantha", "jack": "ilena", "hari": "aradhana", "arun": "maya"}
Если json действителен, и dict не нуждается в обработке перед преобразованием в строку, просто загружайте, как строка делает трюк.
with open('json_test.json', 'r') as f:
json_string = f.read()
print(json_string)