2016-06-17 6 views
0

の配列内のキーに基づいてJSON:Pythonはソート私はこのような構造を有する辞書

[{ 
    "name": "apple", 
    "price": "5.0", 
    "record": [ 
     { 
      "id": "008", 
      "time": 1465689600 
     } 
    ] 
},{ 
    "name": "banana", 
    "price": "9.0", 
    "record": [ 
     { 
      "id": "002", 
      "time": 1465682600 
     } 
    ] 
}] 

は、私は以下しようとしたが、それは私にエラーを与えた:文字列のインデックスは整数でなければなりません。

sorted(lines, key=lambda k: k['record'].get('time', 0),reverse=True) 

「時間」の値に基づいて上記を並べ替えるにはどうすればよいですか?

ありがとうございました。

+0

私はlines'ではなく、解析されたのファイルのテキストである 'と仮定したいですjson。 'json'で解析したら、ここの答えがあなたを助けます。 –

答えて

0

あなたの構造は文字列です。あなたはその後、キー'record'の値がリストであるjson.loads

import json 

d = "[{'record': [{'id': '008', 'time': 1465689600}], 'price': '5.0', 'name': 'apple'}, {'record': [{'id': '002', 'time': 1465682600}], 'price': '9.0', 'name': 'banana'}]" 

lines = json.loads(d) 
sorted(lines, key=lambda k: k['record'][0].get('time', 0), reverse=True) 
#          ^

を使用してPythonオブジェクトに変換する必要があります。リストにはインデックス0のオブジェクトdictが1つあります。したがって、最初にdictオブジェクトにアクセスしてから、辞書の値にアクセスする必要があります。

+0

レコードがリストであった場合、文字列のインデックスは整数でなければならないでしょう。 –

+0

@ TadhgMcDonald-Jensen後で考えました:) –

+1

'ast.literal_eval' ...真剣に?タグ[tag:json]はあなたに何の意味もありませんか? –

0

これはJSONですので、私はちょうどjson.loadsを使用して、それをデコードします:

import json 

lines = ''' 
[{ 
    "name": "apple", 
    "price": "5.0", 
    "record": [ 
     { 
      "id": "008", 
      "time": 1465689600 
     } 
    ] 
},{ 
    "name": "banana", 
    "price": "9.0", 
    "record": [ 
     { 
      "id": "002", 
      "time": 1465682600 
     } 
    ] 
}] 
''' 

d = json.loads(lines) 

for x in sorted(d, key=lambda k: k['record'][0].get('time', 0), reverse=True): 
    print x 

出力:

{u'record': [{u'id': u'008', u'time': 1465689600}], u'price': u'5.0', u'name': u'apple'} 
{u'record': [{u'id': u'002', u'time': 1465682600}], u'price': u'9.0', u'name': u'banana'} 
関連する問題