2016-10-04 6 views
0

としての価値を持つのpythonを使用してJSONファイルをソート:私は(姓またはファーストネーム)キーでソートしたい私はJSONファイル持っている文字列

ll = {"employees":[ 
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"}, 
    {"firstName":"James", "lastName":"Bond"}, 
    {"firstName":"Celestial", "lastName":"Systems"}, 
    {"firstName":"Peter", "lastName":"Jones"} 
]} 

私たちは通りの数で使用ソート方法を知っています値を文字列として値で並べ替えることができません。

私は以下試してみました:

#data = json.load(file) 
new = sorted(data, key = lambda k: k['employees'].get('lastName',0)) 

とエラーを取得する:

TypeError: string indices must be integers 

答えて

1

単一オブジェクトの値を取得するメソッドである必要がありますがsortedkeyにオブジェクトのリストを与える必要があります。

In [1]: ll = {"employees": [{"name": "abc"}, {"name": "bcd"}]} 

In [2]: sorted(ll['employees'], key=lambda x: x['name']) 
Out[2]: [{'name': 'abc'}, {'name': 'bcd'}] 

ご覧のとおり、従業員のリストはsortedです。そして、そのリストのすべての要素にsorted実行lambdaは(それは{"name": "abc"}x['name']を呼び出し、(それが文字列または数値だ場合、それは問題ではありませんキーを使用して、その後nameリストでsortedソート要素を取得します - 。文字列は何とかも数字です - アスキー)。

リストをソートしているときは、ll['employees']または任意の他の場所に割り当てることができます。とにかく

、(あなたはそれのすべてを含んでいませんでした原因)あなたのコードを推測私はあなたがdictsortedを呼び出していることを前提としてい、listではありません。また、あなたは間違って使用していますkeykは完全なオブジェクトではありませんが、 listの単一要素がソートされています)。

1

ll["employees"]リストは、list.sortメソッドを使用してインプレースで並べ替えることができます。 lambdaを使用して独自のキー機能を使用することができますが、より洗練され、operator.itemgetterの方が効率的です。このコードで

、私の主な機能はfirstName続くlastNameのタプルを作成し、そのリストは、主にlastNameでソートされますが、同じlastNameを持つ人々がfirstNameによって並べ替えられています。

from operator import itemgetter 
from pprint import pprint 

ll = {"employees":[ 
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Patti", "lastName":"Smith"}, 
    {"firstName":"Anna", "lastName":"Smith"}, 
    {"firstName":"James", "lastName":"Bond"}, 
    {"firstName":"Celestial", "lastName":"Systems"}, 
    {"firstName":"Peter", "lastName":"Jones"} 
]} 

ll["employees"].sort(key=itemgetter("lastName", "firstName")) 
pprint(ll) 

出力

{'employees': [{'firstName': 'James', 'lastName': 'Bond'}, 
       {'firstName': 'John', 'lastName': 'Doe'}, 
       {'firstName': 'Peter', 'lastName': 'Jones'}, 
       {'firstName': 'Anna', 'lastName': 'Smith'}, 
       {'firstName': 'Patti', 'lastName': 'Smith'}, 
       {'firstName': 'Celestial', 'lastName': 'Systems'}]} 
関連する問題