Як створити словник Python із подвійними лапками як форматом лапок за замовчуванням?


76

Я намагаюся створити словник python, який буде використовуватися як java-сценарій 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)робить цю роботу, але словник у цілому перетворюється на рядок, що не те, що я очікую.

PS: Чи є альтернативний спосіб зробити це за допомогою json, оскільки я маю справу з вкладеними словниками.


5
Коли ви просите надрукувати словник, ви все одно друкуєте перетворення словника у рядок, тому JSON цілком доречний, особливо якщо ви намагаєтеся здійснити обмін з Javascript.
Рассел Борогов

9
Ви нічого не змінюєте щодо словника. Ви створюєте це рядкове представлення. Словник не містить одинарних лапок. Він містить рядки. Вас бентежить, що таке словник.
Рассел Борогов

1
@RussellBorogove: Або, більш принципово, збентежений різницею між фактичним об'єктом рядка та його поданням.
abarnert

1
@ArunprasathShankar Вам потрібно пояснити, чому ви вважаєте, що створення подвійних лапок за замовчуванням - це ваш єдиний варіант. Перетворення на JSON не виключає нових оновлень. Ви завжди можете перетворити на JSON знову, якщо є більше оновлень, правда?
Джон-Ерік,

1
Питання видається принципово помилковим. Ключове слово "print" викликає __str__ у словнику та перетворює його на рядок, як json.dumps(pairs)це робить. OP показує основне непорозуміння, яке він / вона сказав, "але словник у цілому перетворюється на рядок, що не те, що я очікую". Насправді, коли ви друкуєте об’єкт, незалежно від того, як ви його друкуєте, об’єкт спочатку перетворюється на рядок.
Реймонд Хеттінгер

Відповіді:


57

Ви можете створити свою власну версію дикту за допомогою спеціального друку, використовуючи 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

4
Це не працює, якщо деякі з ваших значень dict є булами, і ви плануєте використовувати отриманий рядок в іншому контексті, де він буде оцінений як код Python.
akhomenko

65

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"}

1
Я шукаю альтернативний варіант, де я можу примусити подвійні лапки як варіант за замовчуванням для словників Python.
Шанкар

1
@FJ: У другому випадку json.dumps (пари) повертає рядок. Що робити, якщо я хочу dictвивести об’єкт типу, в якому рядкові ключі містять подвійні лапки?
Pranjal Mittal

5
json.dumpsперетворить словник на рядок, хоча він добре виглядає з подвійними лапками, type(json.dumps(pairs))це рядок, я не думаю, що це очікує ОП
пенні чан

7
# 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"}

Це відповідь, яку слід прийняти як правильну.
Сідон,

@Sidon Я підтверджую це.
Oldboy

6

Ось базова printверсія:

>>> print '{%s}' % ', '.join(['"%s": "%s"' % (k, v) for k, v in pairs.items()])
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}

Рішення чудово підходить для друку. Що робити, якщо мені потрібно буде додатково оновити або повторити словник після зміни лапки?
Шанкар

3
Оновіть pairsі виконайте цей рядок ще раз.
Брент Уошберн,

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" - це перетворення об'єкта в рядок і відправлення його на стандартний вивід.

Коли Python бачить:

print somedict

Що насправді це:

sys.stdout.write(somedict.__str__())
sys.stdout.write('\n')

Як бачите, дикт завжди перетворюється на рядок (після всього рядок є єдиним типом даних, який ви можете надіслати у такий файл, як 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 () .


1

Проблема, яка мене неодноразово викликала, полягає в завантаженні файлу 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)

0

Це просто, лише 2 кроки

step1:converting your dict to list

step2:iterate your list and convert as json .

Для кращого розуміння перегляньте фрагмент нижче

import json
couples = [
               ['jack', 'ilena'], 
               ['arun', 'maya'], 
               ['hari', 'aradhana'], 
               ['bill', 'samantha']]
pairs = [dict(couples)]#converting your dict to list
print(pairs)

#iterate ur list and convert as json
for x in pairs:
    print("\n after converting: \n\t",json.dumps(x))#json like structure
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.