2016-11-08 3 views
-1

ブック情報を持つJSONファイルがあります。 元のファイルにはさらに多くのものがあります。str.splitを使用したJSONファイルのソート値

例:

 [{"author": "Wes McKinney", "price": 53, "title": "Python for Data  Analysis", "publication_year": "2012", "topic": "programming"}, 
     {"author": "Joel Grus", "price": 66, "title": "Data Science from Scratch", "publication_year": "2015", "topic": "Python"}] 

今私は、著者の姓に基づいて情報をソートしたいと思います。 私は次のようでした:

names = [] 
for a in jsondata: 
names.append(str.split((a['author']))) 

print (sorted(names)) 

を、私はこのような情報を得る:

[['Allan', 'Downey'], ['Allan', 'Downey'] 

誰かが私はベースのすべての情報をソートすることができますどのように使用するかを私にヒント/ヒントを与えることができれば、私は思っていました著者の最後の名前に。

答えて

0

これを試してみてください:

names = [] 
for a in jsondata: 
    last_name = a["author"].split(" ")[1] 
    names.append(last_name) 

print(sorted(names)) 

あなたがソートされた辞書を取得したい場合、あなたはこのようにそれを行うことができます。

for a in sorted(jsondata, key=lambda x: x["author"].split(" ")[1]): 
    # You can use dict any way you like. E.g.: 
    print(a["title"] + " " + str(a["price"])) 
+0

行うか行いません。 「試行」はありません。 ***良い答え***は、何が行われたのか、それがなぜOPのためだけでなく、将来の訪問者のためにそうした方法で行われたのかについての説明を常に持っています。 –

1

あなたがlambda表現としてでsorted()を使用してJSONの構造を並べ替えることがあります。

lambda x: x["author"].split()[-1] 
# split value of "author", key and sort based on the last word 

明示的に反復する必要はありませんリストを食べ、名前を維持する別のリストを作成します。

サンプル実行:

>>> my_json = [ 
     {"author": "Wes McKinney", "price": 53, "title": "Python for Data  Analysis", "publication_year": "2012", "topic": "programming"}, 
     {"author": "Joel Grus", "price": 66, "title": "Data Science from Scratch", "publication_year": "2015", "topic": "Python"} 
    ] 

>>> sorted(my_json, key=lambda x: x["author"].split()[-1]) 
[{'topic': 'Python', 'price': 66, 'title': 'Data Science from Scratch', 'publication_year': '2015', 'author': 'Joel Grus'}, {'topic': 'programming', 'price': 53, 'title': 'Python for Data  Analysis', 'publication_year': '2012', 'author': 'Wes McKinney'}] 
0

あなただけの各辞書の「作者」キーに関連付けられた値から最後の名を抽出し、適切なキー機能をjsondataリストをソートする必要があります。

私は.rsplitメソッドを使用しました。これにより、2つ以上の名前を持つ派閥を効率的に処理できるようになりました。 .rsplit(None, 1)は、空白の文字列を右側から分割し、1つに分割し、2つの要素を含むリストを返します。最後の名前がそのリストの最後の要素になります。 「Guido Van Rossum」の姓を「Van Rossum」にしたい場合は、別の分割戦略を使用する必要があります。

import json 

jsondata = [ 
    { 
     "author": "Wes McKinney", "price": 53, 
     "title": "Python for Data  Analysis", 
     "publication_year": "2012", "topic": "programming" 
    }, 
    { 
     "author": "Joel Grus", "price": 66, 
     "title": "Data Science from Scratch", 
     "publication_year": "2015", "topic": "Python" 
    }, 
    { 
     "author": "One", 
    }, 
    { 
     "author": "Person With A Long Name", 
    }, 
] 

def last_name(d): 
    return d["author"].rsplit(None, 1)[-1] 

# Verify that `last_name` does what we want 
for d in jsondata: 
    print(last_name(d)) 

jsondata.sort(key=last_name) 

print(json.dumps(jsondata, indent=4)) 

出力

McKinney 
Grus 
One 
Name 
[ 
    { 
     "title": "Data Science from Scratch", 
     "author": "Joel Grus", 
     "topic": "Python", 
     "publication_year": "2015", 
     "price": 66 
    }, 
    { 
     "title": "Python for Data  Analysis", 
     "author": "Wes McKinney", 
     "topic": "programming", 
     "publication_year": "2012", 
     "price": 53 
    }, 
    { 
     "author": "Person With A Long Name" 
    }, 
    { 
     "author": "One" 
    } 
] 
関連する問題