我有一个带有多个结果的JSON文件:
[{
"objectID": 1,
"results": [
{
"model": "Audi Audi TT Roadster",
"price_int": 2200,
"rzc_result_url": "https://url1.jpg"
},
{
"model": "Audi TT Roadster 1.8 T",
"price_int": 2999,
"rzc_result_url": "https://url1.jpg"
},
{
"model": "Audi TT Roadster 1.8 T",
"price_int": 2999,
"rzc_result_url": "https://url1.jpg"
}]
},
...
显然有多个objectID。我还有另一个带有字符串的文件。对于每个objectID,如果该字符串在列表exclude_model文件中,我希望脚本能够删除结果:
{
"1": ["1.8"],
...
}
预期输出:
[{
"objectID": 1,
"results": [
{
"model": "Audi Audi TT Roadster",
"price_int": 2200,
"rzc_result_url": "https://url1.jpg"
}]
我的代码:
def excludeModels():
with open('../json/exclude_models.json', encoding='utf-8') as data_file:
r = json.loads(data_file.read())
for item in data:
results = item["results"]
for k in results:
objectID = item["objectID"]
print(objectID)
for d in r.get(objectID, []):
if d in results[k]['model']:
del results[k]
break
excludeModels()
我假设data
并r
正在:
data = [
{
"id": 1,
"results": [
{
"model": "Audi Audi TT Roadster",
"price_int": 2200,
"rzc_result_url": "https://url1.jpg"
},
{
"model": "Audi TT Roadster 1.8 T",
"price_int": 2999,
"rzc_result_url": "https://url1.jpg"
},
{
"model": "Audi TT Roadster 1.8 T",
"price_int": 2999,
"rzc_result_url": "https://url1.jpg"
}
]
}
]
r = {"1": ["1.8"]}
然后,您可以使用以下功能过滤数据字典。注意,id
在data
字典中是整数,但是在字典中是字符串r
!那是上面代码中的一个问题。
另外,请注意如何删除列表中的值!当您遍历列表时,将删除值,这可能会导致您无法遍历整个列表,这是因为您删除了自己的值。因此,我首先要收集要删除的索引indices_to_del
。然后,我以相反的顺序遍历此列表,以确保删除要删除的值。
def excludeModels(data, r):
for item in data:
results, objectID = item["results"], item["id"]
unwanted_strings = r.get(str(objectID), [])
indices_to_del = []
for i, item_res in enumerate(results):
if any([(u_s in item_res['model']) for u_s in unwanted_strings]):
indices_to_del.append(i)
for res_i in indices_to_del[::-1]:
results.pop(res_i)
结果如下:
>>> excludeModels(data, r)
>>> print(data)
[{'id': 1, 'results': [{'model': 'Audi Audi TT Roadster', 'price_int': 2200, 'rzc_result_url': 'https://url1.jpg'}]}]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句