web-dev-qa-db-ja.com

デフォルトの引用形式として二重引用符を使用してPython辞書を作成するには?

視覚化のためにhtmlファイル内でpythonスクリプト変数として使用されるJava辞書を作成しようとしています。必要条件として、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を使用してこれを行う別の方法はありますか。

43
Shankar

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
34
elyase

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"}
51
Andrew Clark

基本的なprintバージョンは次のとおりです。

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

質問の前提は間違っています:

_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')
_

ご覧のとおり、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()がすでに行っていることを再発明します。

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

複数回取得している問題は、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ファイルを再確認し、二重引用符を確認してから1分間頭をかきます。

問題は、データが文字列ではなく辞書であるということですが、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)
1
shao.lo