2017-07-16 232 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