Подтвердить что ты не робот

Как создать словарь 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, так как я имею дело со вложенными словарями.

4b9b3361

Ответ 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)