2017-11-26 8 views
-3

保存タプルする辞書を変換し、これは私は辞書を持っているため

{'name': 'satendra', 'occupation': 'engineer', 'age': 27} 

がどのように私は、これはそれがタプルの順序付きリストをもたらすことがとてもタプルに変換することができ、任意の数のフィールドを持つことができ辞書の例であります。ないJSONオブジェクトに渡されたタプルのリストを命じたとき

# Expected output 
[('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)] 

UPDATE

OrderedDictは便利ですので、私は、これは、重複

+0

ご注文は、キーと値のペアを維持することを意味しますか? –

+0

'name'キーが私のdictの最初のフィールドであるので、タプルに変換するときにも最初に来るはずです – Satendra

+1

' OrderedDict'を使用してください。*本質的にはタプルのリストです。 – DeepSpace

答えて

1

コメントから既に理解しているように、最初は順序がないので保存する順序はありません。このJSONは任意の順序でサーバーから到着する可能性があります。

しかし、あなたが興味のあるキーを知っていれば、タプルのリストを自分で作ることができます。

このコードは、既知の順序でキーの別のタプルを繰り返し処理することに注意してください。手動でそのタプルを維持する必要があります。

relevant_keys = ('name', 'occupation', 'age') 
data = {'occupation': 'engineer', 'age': 27, 'name': 'satendra'} 
list_of_tuples = [(key, data[key]) for key in relevant_keys] 
print(list_of_tuples) 
# [('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)] 
+0

ありがとう@DeepSpace jsonオブジェクトが順序付けられていないという意味があります。 – Satendra

+0

@Satendra:はい、それは私の答えの下でコメントしたように行うことができますが、JSONを希望の順序でパックすることは幸いです。それを提供するサーバーがあなたのためにそれを行うために非常に丁寧であれば、それを解析して元の順序を保つことができます。それ以外の場合は、試しても意味がありません。つまり、サーバーは注文したJSONを送信する理由がありません。 :D – Dalen

-4

MyDict = {「名前」でないと思います。 'satendra'、 '占領': 'エンジニア'、 '年齢':27} MyDictでキーの場合

MYLIST = []

MyList.append((key,MyDict[key])) 

今マイリストはタプルのリストです。

+0

しかし、 'dict'が順序付けられていないので、順序は保持されません。 – Chris

+0

これを数回実行すると、これは注文されたものであることがわかります。 – DeepSpace

+0

定義によると、dictが順序付けされていないので、これは悪い答えです。 – ddor254

-1
コメントで示唆したよう

利用OrderedDict()が、正しくは:

from collections import OrderedDict 

d = OrderedDict([('name', 'satendra'), ('occupation', 'engineer'), ('age', 27)]) 

あなたは、あなたの出力になりたいと、それを定義します。その後、通常の辞書と同じように使用します。

そして、あなたが戻ってタプルのリストをしたいとき、あなたがやる:あなたが期待するとあなたはOrderedDict()を使用することはできませんどのようなキーを知っているときは、このソリューションを使用することができます

t = d.items() 

def sortdict (d, keys=["name", "occupation"]): 
    mx = len(keys) 
    def customsortkey (key): 
     try: return keys.index(key) 
     except: return mx 
    kys = sorted(d, key=customsortkey) 
    return [(key, d[key]) for key in kys] 

この関数は、入力辞書 "d"のすべてを "keys"リストで設定された順序に従ってソートします。リストの "キー"にキーが存在しない辞書内の項目は、出力の最後に任意の順序で置かれます。辞書に存在しないキーを指定することができます。 出力は、必要に応じてタプル(キー、値)のリストになります。

これは可能な解決策の1つであり、理想から遠いです。私。効率とオーバーヘッドについて議論を開始することができます。しかし実際には、実際には正常に動作し、予期しないキーをうまく処理します。 この関数のより効率的なバージョンは、辞書を使用してリストの代わりにキーの順序を示すことです。対象のキーとその値のソート・インデックスを持つ辞書。 このように:

def sortdict (d, keys={"name": 0, "occupation": 1}): 
    mx = len(keys) 
    kys = sorted(d, key=lambda k: keys.get(k, mx)) 
    return [(key, d[key]) for key in kys] 
+0

コメントを読む。 OPは、APIからの応答であるため、辞書の作成を制御できません。 – DeepSpace

+0

答えを入力している間にコメントが届きました。私は解決策を提案しますが、あなたはすでにそれを概説しました。独自のJSONパーサーを作成し、サーバーが必要な順序で構築されたJSONを送信することを望む場合を除いて、現在のキーを知らない場合は他には何もありません。それはそうではないでしょう。 – Dalen

+0

ここで@DeepSpaceに行って、あなたが私の編集が好きになると思います。 – Dalen

関連する問題