2017-07-16 297 views
0

我有類似這樣基於另一個列表

filename = 'data.json' 
with open(filename, 'r') as f: 
    data = json.load(f) 

data.json

[{ 
     "id":"1", 
     "url":"http://", 
     "Types:["online","offline" ], 
     "content:[{ 
     "Title":"A long title" 
     "body":"A long body" 
     }], 
     "Other":"other1" 


    }, 
    { 
     "id":"2", 
     "url":"http://2", 
     "Types:["online2","offline"2 ], 
     "content:[{ 
     "Title":"A long title2" 
     "body":"A long body2" 
     }], 
     "Other":"other2" 


    }, 
    . 
    . 
    . 
    { 
     "id":"2000", 
     "url":"http://2000", 
     "Types:["online2","offline2000" ], 
     "content:[{ 
     "Title":"A long title200" 
     "body":"A long body200" 
     }], 
     "Other":"other2000" 


    }] 

我想創建一個新的JSON文件JSON文件在JSON對象中篩選出的項目,如果ID在原來匹配我的預期ID s。

對於simplesity讓我們假設我想創建一個與原來的JSON的奇IDS一個新的JSON:

[{ 
    "id":"1", 
    "url":"http://", 
    "Types:["online","offline" ], 
    "content:[{ 
    "Title":"A long title" 
    "body":"A long body" 
    }], 
    "Other":"other1" 


}, 
{ 
    "id":"3", 
    "url":"http://3", 
    "Types:["online2","offline"3 ], 
    "content:[{ 
    "Title":"A long title3" 
    "body":"A long body2" 
    }], 
    "Other":"other3" 


}, 
. 
. 
. 
{ 
    "id":"1999", 
    "url":"http://1999", 
    "Types:["online1999","offline1999" ], 
    "content:[{ 
    "Title":"A long title1999" 
    "body":"A long body1999" 
    }], 
    "Other":"other1999" 
}] 

我應該怎樣做呢?

EDIT

這是我曾嘗試,我加入我的優選的ID在陣列中。

js=[] 
for i in data: 
    #print i 
    if i['id']==arr: 
     js.append(i) 
    else: 
     continue 
+0

你試過了什麼?添加你的代碼。 –

+1

這很簡單。我們可以提供幫助,但我們需要一些東西。你的ID列表在哪裏?你有什麼嘗試? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我編輯了這個問題並添加了我的方法,但它返回空數組 – Eka

回答

1

首先,將您id_list一組快速高效地查找:

id_set = set(arr) 

接下來,你可以使用filter僅保留在您的列表,它的ID匹配之一那些項目那些在你的名單中。

new_data = list(filter(lambda x: x['id'] in id_set, data)) 

確保您id_set元素都是字符串,因爲id在你的例子是字符串類型。

+0

我有他的錯誤'KeyError:'id''也可以簡化代碼多一點。我對過濾器和lamdas只有最基本的瞭解 – Eka

+0

@EKA'KeyError:'id''表示您發佈的數據與您擁有的數據不一樣。 _actually_具有ID的密鑰的名稱是什麼? 'filter'將過濾出列表中不符合lambda函數指定條件的元素。 –

+0

我想apolgize第一bcoz我很少工作機智過濾器和lambda是這是正確的'lambda x:x ['id']在id_set'我'id_set'具有類似於這個'{「1」,「3」,「 5「,....」1999「}'它沒有和變量」ID「 – Eka

0
with open("data.json", "r+") as f:   
    original = json.load(f) 
    processed = [entry for entry in original if int(entry['id']) % 2 == 1] 
    f.seek(0) 
    json.dump(processed, f) 
    f.truncate() 
+1

爲什麼兩個上下文管理器只需要一個? –

+0

編輯。感謝您的建議 – bogdanciobanu

+0

雖然此代碼可能會回答問題,但提供有關如何解決問題和/或爲何解決問題的其他上下文可以提高答案的長期價值。 – Badacadabra