如何创建一个双引号作为默认报价格式的Python字典?

Sha*_*kar 47 python dictionary python-2.7 python-3.x

我正在尝试创建一个python字典,它将用作html文件中的java脚本var以进行可视化.作为一个必要条件,我需要创建一个字典,其中所有名称都在双引号内,而不是Python使用的默认单引号.是否有一种简单而优雅的方式来实现这一目标.

    couples = [
               ['jack', 'ilena'], 
               ['arun', 'maya'], 
               ['hari', 'aradhana'], 
               ['bill', 'samantha']]
    pairs = dict(couples)
    print pairs
Run Code Online (Sandbox Code Playgroud)

生成输出:

{'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
Run Code Online (Sandbox Code Playgroud)

预期产出:

{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Run Code Online (Sandbox Code Playgroud)

我知道,json.dumps(pairs)做的工作,但字典作为一个整体被转换成一个字符串,这不是我所期待的.

PS:使用json是否有另一种方法可以做到这一点,因为我正在处理嵌套字典.

And*_*ark 55

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"}
Run Code Online (Sandbox Code Playgroud)

  • 我正在寻找一个替代选项,可以强制将双引号作为 Python 字典的默认选项。 (3认同)
  • `json.dumps`将字典转换为字符串,虽然它看起来很好用双引号,`type(json.dumps(pairs))`是字符串,我不认为这是OP所期望的 (3认同)

ely*_*ase 37

您可以使用json.dumps()以下特殊打印构建自己的dict版本:

>>> 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"}
Run Code Online (Sandbox Code Playgroud)

你也可以迭代:

>>> for el in pairs:
       print el

arun
bill
jack
hari
Run Code Online (Sandbox Code Playgroud)

  • 如果你的某些dict值是bool并且你打算在其他上下文中使用结果字符串,那么它将被用作Python代码. (3认同)
  • 如果你使用UTF-8,你需要`ensure_ascii=False` (2认同)

Rus*_*ove 10

# 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
Run Code Online (Sandbox Code Playgroud)

产量:

{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Run Code Online (Sandbox Code Playgroud)

  • 这是应该被接受为正确的答案。 (2认同)

Bre*_*rne 7

这是一个基本print版本:

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

  • 更新 `pairs`,然后再次执行此行。 (3认同)

Ray*_*ger 5

问题的前提是错误的:

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.
Run Code Online (Sandbox Code Playgroud)

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

当Python看到:

print somedict
Run Code Online (Sandbox Code Playgroud)

它真正做的事情是:

sys.stdout.write(somedict.__str__())
sys.stdout.write('\n')
Run Code Online (Sandbox Code Playgroud)

如您所见,字典始终会转换为字符串(毕竟字符串是您可以发送到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.
Run Code Online (Sandbox Code Playgroud)

为什么要这么努力避免使用json模块呢?几乎任何解决使用双引号打印嵌套字典问题的解决方案都将重新发明json.dumps()已经做的事情。