如何使用双引号作为默认引号格式创建 Python 字典?
Posted
技术标签:
【中文标题】如何使用双引号作为默认引号格式创建 Python 字典?【英文标题】:How to create a Python dictionary with double quotes as default quote format? 【发布时间】:2013-08-19 11:23:25 【问题描述】:我正在尝试创建一个 python 字典,该字典将用作 html 文件中的 java script 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)
完成了这项工作,但是整个字典被转换成一个字符串,这不是我所期望的。
P.S.:是否有另一种使用 json 的方法来做到这一点,因为我正在处理嵌套字典。
【问题讨论】:
当您要求打印字典时,无论如何您都在打印字典到字符串的转换,因此 JSON 是完全合适的——尤其是当您尝试与 javascript 交换时。跨度> 你没有改变任何关于字典的东西。您正在创建它的字符串表示形式。字典不包含单引号。它包含字符串。您对字典是什么感到困惑。 @RussellBorogove:或者,更根本的是,对实际字符串对象与其表示之间的区别感到困惑。 @ArunprasathShankar 您需要解释为什么您认为将双引号作为默认设置是您唯一的选择。转换为 JSON 并不排除更多更新。如果有更多更新,您总是可以再次转换为 JSON,对吧? 这个问题似乎从根本上被误导了。 “print”关键字在字典上调用 __str__ 并将其转换为字符串,就像json.dumps(pairs)
所做的那样。 OP 显示了一个基本的误解,他/她说“但是整个字典被转换成一个字符串,这不是我所期望的。”其实,当你打印一个对象的时候,不管你怎么打印,都是先把对象转成字符串。
【参考方案1】:
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"
【讨论】:
我正在寻找一个替代选项,我可以强制双引号作为 Python 字典的默认选项。 @FJ:在第二种情况下 json.dumps(pairs) 返回一个字符串。如果我想要一个dict
类型的对象输出,其中的字符串键用双引号括起来怎么办?
json.dumps
会将字典转换为字符串,尽管双引号看起来不错,type(json.dumps(pairs))
是字符串,我认为这不是 OP 所期望的【参考方案2】:
您可以使用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"
你也可以迭代:
>>> for el in pairs:
print el
arun
bill
jack
hari
【讨论】:
如果您的某些 dict 值是布尔值并且您计划在将其作为 Python 代码评估的其他上下文中使用结果字符串,则此方法不起作用。 如果你使用UTF-8你需要ensure_ascii=False
【参考方案3】:
# 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 我赞同这一点。【参考方案4】:这是一个基本的print
版本:
>>> print '%s' % ', '.join(['"%s": "%s"' % (k, v) for k, v in pairs.items()])
"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"
【讨论】:
解决方案适合打印。如果我需要在引用更改后进一步更新或迭代字典怎么办? 更新pairs
,然后再次执行此行。【参考方案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.
您应该期待转换为字符串。 “print”所做的只是将对象转换为字符串并将其发送到标准输出。
当 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() 已经在做的事情。
【讨论】:
【参考方案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)
【讨论】:
【参考方案7】:简单两步
step1:converting your dict to list
step2:iterate your list and convert as json .
为了更好地理解下面的 sn-p
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
【讨论】:
以上是关于如何使用双引号作为默认引号格式创建 Python 字典?的主要内容,如果未能解决你的问题,请参考以下文章