如何创建带有双引号作为默认引号格式的Python词典?


76

我正在尝试创建一个python字典,该字典将用作html文件中的java脚本var,以实现可视化目的。作为必要条件,我需要创建所有名称都用双引号而不是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显示了一个基本的误解,他/她说:“但是整个字典都被转换成了我所期望的字符串。” 实际上,当您打印对象时,无论如何打印,该对象都会首先转换为字符串。
Raymond Hettinger 2015年

Answers:


56

您可以使用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 '17

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(pairs)返回一个字符串。如果我要dict输出字符串键在双引号中的类型对象怎么办?
Pranjal Mittal'3

5
json.dumps它将字典转换为字符串,尽管它看起来很好用双引号,但是它type(json.dumps(pairs))是字符串,我不认为这是OP期望的
penny chan

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

这是应该接受的正确答案。
西顿

@西顿我第二个。
老男孩”

6

这是基本print版本:

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

解决方案适合打印。如果在更改引号后需要进一步更新或迭代字典怎么办?
2013年

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.

您应该期望转换为字符串。所有“打印”所做的就是将对象转换为字符串并将其发送到标准输出。

当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在转换为字符串之前不需要处理,则只需按string的方式进行即可。

with open('json_test.json', 'r') as f:
    json_string = f.read()
    print(json_string)

0

简单两步

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.