如果另一个文件的Python列表中的字符串
我有一个包含多个结果的JSON文件:如果另一个文件的Python列表中的字符串,python,json,Python,Json,我有一个包含多个结果的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": 299
[{
"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,如果字符串在列表中,我希望脚本能够删除结果
排除模型文件:
{
"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()
JSON中没有
objectID
键,它是id
无需每次通过k
循环设置objectID
您可以使用any()
函数在一次调用中测试所有排除
def excludeModels():
with open('../json/exclude_models.json', encoding='utf-8') as data_file:
r = json.load(data_file)
for item in data:
results = item["results"]
objectID = item["id"]
print(objectID)
if objectID in r:
exclusions = r[objectID]
for k, val in results.items():
if any(d in val['model'] for d in exclusions)
del results[k]
我假设
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"]}
>>> excludeModels(data, r)
>>> print(data)
[{'id': 1, 'results': [{'model': 'Audi Audi TT Roadster', 'price_int': 2200, 'rzc_result_url': 'https://url1.jpg'}]}]
然后您可以使用以下函数过滤数据字典。注意,id
在data
字典中是整数,但在r
字典中是字符串!这是上面代码中的一个问题
另外,在删除列表中的值时要小心!当您迭代从中删除值的列表时,可能会出现一个问题,您无法迭代整个列表,因为您删除了手中的值。这就是为什么我首先将要删除的索引收集到索引中。然后,我以相反的顺序迭代这个列表,以确保删除我真正想要删除的值
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)
结果如下:
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"]}
>>> excludeModels(data, r)
>>> print(data)
[{'id': 1, 'results': [{'model': 'Audi Audi TT Roadster', 'price_int': 2200, 'rzc_result_url': 'https://url1.jpg'}]}]
您想从json文件还是内存字典中删除项?我想是从内存字典中删除。事实上,在我的代码中,字典是从一个json文件创建的,但在本例中我没有对其进行精确说明。objectID=item[“objectID”]
您的意思是objectID=item[“id”]
?。另外,你在哪里加载另一个文件?你能解释一下排除标准的细节吗?我看不到输入和输出之间有明显的关系。很抱歉出现了错误,我对其进行了编辑。在本例中,两个结果中都有“1.8”字符串,因此我想删除每一个结果。您可能需要解释为什么末尾的循环是反向的。@Barmar,感谢您注意我。我编辑了我的答案。