2017-07-06 5 views
0

辞書を持つ文字列が1つありますが、リストに変換したいが、同じ引用符を削除することはできません。辞書の文字列を一重引用符を削除してリストに変換する

ここで不足しているものを見つけ出すのに助けてくれる人がいますか?

>>> a = '{"src_ports": [7] , "dst_ports": [8]}' 

次は何が欲しい:

[{"src_ports": [7] , "dst_ports": [8]}] 

しかし、私が取得することは以下の通りです:

>>> a = [a] 
>>> a 
['{"src_ports": [7] , "dst_ports": [8]}'] 

編集:ASTと 、辞書の要素の順序が変更されます、私がする必要がありますそれをそのまま保つ。

>>> import ast 
>>> b = [ast.literal_eval(a)] 
>>> b 
[{'dst_ports': [8], 'src_ports': [7]}] 
+0

'import json; [json.loads(a)] ' –

+0

余分なモジュールをインポートしなくても可能ですか? –

+0

'a'を元々文字列にするのはなぜですか?文字列ではなく、文字列でなければならないのはなぜですか?最初から辞書を作ってみませんか? –

答えて

3
  • json.loadsを使用して(と秩序を維持する)

    >>> import ast 
    >>> [ast.literal_eval(a)] 
    [{'src_ports': [7], 'dst_ports': [8]}] 
    
  • を:

    >>> import collections 
    >>> import json 
    >>> [json.loads(a, object_pairs_hook=collections.OrderedDict)] 
    [OrderedDict([('src_ports', [7]), ('dst_ports', [8])])] 
    

    OrderedDictはまだ辞書ですので、あなたは同じその要素にアクセスできることあなたは普通の方法になります。

+0

@wim、あなたは私の 'eval'答えを目的に応じて削除しましたか? –

+0

はい、それはそれかdownvoteでした。あなたがdownvoteを好むなら、ロールバックします。 – wim

+0

@wimそれは問題ではありませんが、OPは輸入に関係しない方法を求めていました。 –

0

あなたはそのためのより安全eval()としてast.literal_eval()機能を使用することができます。

import ast 

a = '{"src_ports": [7] , "dst_ports": [8]}' 

b = [ast.literal_eval(a)] 
# [{'dst_ports': [8], 'src_ports': [7]}] 

UPDATE - あなたの構造は同じまま、あなたならば、あなたはcollections.OrderedDictとの組み合わせでjsonモジュールを使用することができます提供を注文を保存したいPythonのdictとJSONの両方が、一般的に、順不同の構造であることに留意してください:

import json 
import collections 

a = '{"src_ports": [7] , "dst_ports": [8]}' 

b = json.loads(a, object_pairs_hook=collections.OrderedDict) 

しかし、あなたはそれを、それをプリントアウトした場合のご注文は、例えば、保存されますが、あなたがしている場合は、OrderedDict([(u'src_ports', [7]), (u'dst_ports', [8])])ような何かを得るでしょう後でそれをシリアライズするか、それをループします。

ast.literal_eval使用
+0

@ zwer、私はそれを試した、それは辞書の要素の順序を変更する、とにかく辞書に同じ順序を維持するにはありますか? –

+0

@Sweety 3.6より下のピュータンで辞書に暗黙の順序はありません。必要に応じて、 'collections.OrderedDict'を使用することをお勧めします。これは注文を保存します。 –

+0

@スウェット - アップデートを確認してください。 – zwer

関連する問題