2017-11-23 2 views
0

私はその中に複数の辞書のリスト(JSONとして)を持っています。私は値のリストを持っており、その値に基づいてその特定の値のJSONオブジェクトが必要です。たとえば。特定の値を持つ特定のJSONオブジェクトを選択するにはどうすればよいですか?

[{'content_type': 'Press Release', 
    'content_id': '1', 
    'Author':John}, 
{'content_type': 'editorial', 
    'content_id': '2', 
    'Author': Harry 
}, 
{'content_type': 'Article', 
    'content_id': '3', 
    'Author':Paul}] 

著者がPaulの完全なオブジェクトを取得したいと思います。 これまでに作ったコードです。

import json 
newJson = "testJsonNewInput.json" 
ListForNewJson = [] 
def testComparision(newJson,oldJson): 
    with open(newJson, mode = 'r') as fp_n: 
    json_data_new = json.load(fp_n) 
for jData_new in json_data_new: 
    ListForNewJson.append(jData_new['author']) 

その他の情報が必要な場合は、お尋ねください。

+0

これらの検索を複数回実行する予定ですか? –

+0

はい。見つけたい著者は複数存在することがあり、ループによって少し遅くなります。 – john

+0

[辞書の値でキーを取得]の可能な複製(https://stackoverflow.com/questions/8023306/get-key-by-value-in-dictionary) –

答えて

0

ケース1
ワンタイムアクセス

それはあなたのデータを読み込み、最初に見つかったマッチを返し、それを反復するために完全に大丈夫です。この場合

def access(f, author): 
    with open(file) as f: 
     data = json.load(f) 

    for d in data: 
     if d['Author'] == author: 
      return d 
    else: 
     return 'Not Found' 

ケース2
繰り返しアクセス

、(著者名によるオブジェクトへのアクセスははるかに高速であるように、あなたのデータを再構築するのが賢明だろう辞書を考える!)。

例えば、一つの可能​​なオプションは次のようになります。今

with open(file) as f: 
    data = json.load(f) 

newData = {} 
for d in data: 
    newData[d['Author']] = d 

、関数を定義し、著者名のリストと一緒にプリロードされたデータを渡します。

def access(myData, author_list): 
    for a in author_list: 
     yield myData.get(a) 

機能は、このように呼ばれている。また

for i in access(newData, ['Paul', 'John', ...]): 
    print(i) 

、リストrに結果を格納します。 yieldは反復処理によって消耗しなければならないジェネレータオブジェクトを返すので、list(...)が必要です。

r = list(access(newData, [...])) 
0

なぜこのようなことをしないのですか?それは速くなければならず、検索されない著者をロードする必要はありません。

alreadyknown = {} 
list_of_obj = [{'content_type': 'Press Release', 
    'content_id': '1', 
    'Author':'John'}, 
    {'content_type': 'editorial', 
    'content_id': '2', 
    'Author': 'Harry' 
    }, 
    {'content_type': 'Article', 
    'content_id': '3', 
    'Author':'Paul'}] 
def func(author): 
    if author not in alreadyknown: 
     obj = get_obj(author) 
     alreadyknown[author] = obj 
    return alreadyknown[author] 
def get_obj(auth): 
    return [obj for obj in list_of_obj if obj['Author'] is auth] 
print(func('Paul'))