2013-08-16 53 views
29

我想創建一個python字典,這是一個用於可視化目的的html文件內的java腳本var。作爲必備條件,我需要使用雙引號內的所有名稱創建詞典,而不是Python使用的默認單引號。有沒有一種簡單而優雅的方式來實現這一點。如何使用雙引號將默認報價格式創建爲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)做工作,但字典作爲一個整體被轉換成字符串這不是我所期待的。

評論:是否有另一種方法來使用json來做到這一點,因爲我正在處理嵌套字典。

+0

不是說它解決了你的問題,但更好的方法來創建對將是用pair = dict(couples)替換你的第2-4行。 – qaphla

+4

當您要求打印字典時,無論如何您都將字典轉換爲字符串,所以JSON完全合適 - 特別是如果您嘗試與Javascript交換。 –

+0

我需要一種替代方法,因爲在雙引號更改後需要更新和迭代字典。 json.dumps將字典轉換爲字符串。有沒有辦法使雙引號成爲默認選項。 – Shankar

回答

22

您可以構建自己的字典版本使用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 
+3

如果某些字典值是bools,並且您計劃在其他將被評估爲Python代碼的上下文中使用結果字符串,則這不起作用。 – akhomenko

33

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

我正在尋找替代選項,我可以強制將雙引號作爲Python字典的默認選項。 – Shankar

+0

@FJ:在第二種情況下,json.dumps(對)返回一個字符串。如果我想要一個'dict'類型的對象輸出,其中的字符串鍵在雙引號中怎麼辦? –

+0

'json.dumps'會將字典轉換爲字符串,儘管使用雙引號看起來不錯,'type(json.dumps(pairs))'是字符串,我不認爲這是OP期望的結果 –

3

這是一個基本print版本:

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

解決方法適用於打印。如果我需要在引用更改後進一步更新或迭代字典,該怎麼辦? – Shankar

+2

更新'對',然後再次執行此行。 –

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

這個問題的前提是錯誤的:

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是有效的,並轉換爲字符串之前的字典不需要處理,只需加載作爲字符串的伎倆。

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