#python #json
Вопрос:
Пытаюсь удалить записи из файла JSON, но не могу заставить его работать.
Файл JSON выглядит следующим образом;
[
{
"productName": "PlayStation 4",
"productPrice": "129.5",
"productUrl": "productUrl.com",
"trackingUrl": "trackUrl.com",
"currency": "EUR",
"programId": 10627777,
"approvalStatus": 1,
"ean": "0711719215",
"sku": "abc123",
"extraInfo": [
{
"key": "color",
"value": "red"
}
],
"imageUrl": "store/product_acb.png",
"inStock": true,
"manufacturer": "Sony",
"manufacturerArticleNumber": "1245678",
"market": "SE",
"oldPrice": 45,
"productCategory": "Consoles",
"productDescription": "PlayStation 4 redefines rich and immersive gameplay with
powerful graphics and speed.",
"shipping": 9
},
{
"productName": "Macbook Pro",
"productPrice": "1400",
"productUrl": "site/store/product_acb",
"trackingUrl": "trackUrl",
"currency": "EUR",
"programId": 1062777,
"approvalStatus": 1,
"ean": "0711719215",
"sku": "abc123",
"extraInfo": [
{
"key": "color",
"value": "silver"
}
],
"imageUrl": "imgurl.com",
"inStock": true,
"manufacturer": "Apple",
"manufacturerArticleNumber": "12345678",
"market": "SE",
"oldPrice": 45,
"productCategory": "Laptops",
"productDescription": "The best Macbook yet.",
"shipping": 6
}
]
Что я хочу сделать, так это удалить всю запись, если она соответствует одной из категорий, внесенных в черный список.
Файл, с которым я работаю;
import requests
blacklisted_categories = [
'Laptops'
]
r = requests.post(JSON API response)
def trim_json():
for resource in r.json():
if any(ele in resource["productCategory"] for ele in blacklisted_categories):
del resource
Фильтрация категорий работает, но del resource
не работает. Я использую неправильный синтаксис или вы видите какую-либо другую проблему?
Комментарии:
1. Вы хотите «удалить» из списка, который не работает таким образом. Удаление элементов из списка обходится дорого. Просто создайте новый, с помощью понимания списка, без элементов черного списка.
Ответ №1:
Я бы просто создал новый список, содержащий все записи, которые не занесены в черный список.
import requests
blacklisted_categories = [
'Laptops'
]
records = requests.post("JSON API URL").json()
new_records = [r for r in records if r['productCategory'] not in blacklisted_categories]
Комментарии:
1. Работает как волшебство! Застрял с моей функцией фильтра, так как [«Категория продукта»] включала подкатегории в значение. Например, «Ноутбуки — сенсорный экран — 15 дюймов». В любом случае, спасибо вам!
2. @Jonas Take-away: Вот почему важно, чтобы в вашем вопросе были примеры кода, соответствующие вашей реальной ситуации.
Ответ №2:
Вы можете использовать filter
:
filter(lambda x: x['productCategory'] == 'Laptops', r)
r = [{"productName": "PlayStation 4", "productPrice": "129.5", "productUrl": "productUrl.com", "trackingUrl": "trackUrl.com", "currency": "EUR", "programId": 10627777, "approvalStatus": 1, "ean": "0711719215", "sku": "abc123", "extraInfo": [{"key": "color", "value": "red"} ], "imageUrl": "store/product_acb.png", "inStock": True, "manufacturer": "Sony", "manufacturerArticleNumber": "1245678", "market": "SE", "oldPrice": 45, "productCategory": "Consoles", "productDescription": "PlayStation 4 redefines rich and immersive gameplay with powerful graphics and speed.", "shipping": 9 }, {"productName": "Macbook Pro", "productPrice": "1400", "productUrl": "site/store/product_acb", "trackingUrl": "trackUrl", "currency": "EUR", "programId": 1062777, "approvalStatus": 1, "ean": "0711719215", "sku": "abc123", "extraInfo": [{"key": "color", "value": "silver"} ], "imageUrl": "imgurl.com", "inStock": True, "manufacturer": "Apple", "manufacturerArticleNumber": "12345678", "market": "SE", "oldPrice": 45, "productCategory": "Laptops", "productDescription": "The best Macbook yet.", "shipping": 6 } ]
print(list(filter(lambda x: x['productCategory'] == 'Laptops', r)))
>> [{'productName': 'Macbook Pro', 'productPrice': '1400', 'productUrl': 'site/store/product_acb', 'trackingUrl': 'trackUrl', 'currency': 'EUR', 'programId': 1062777, 'approvalStatus': 1, 'ean': '0711719215', 'sku': 'abc123', 'extraInfo': [{'key': 'color', 'value': 'silver'}], 'imageUrl': 'imgurl.com', 'inStock': True, 'manufacturer': 'Apple', 'manufacturerArticleNumber': '12345678', 'market': 'SE', 'oldPrice': 45, 'productCategory': 'Laptops', 'productDescription': 'The best Macbook yet.', 'shipping': 6}]
Или, используя понимание списка:
[a for a in r if a['productCategory'] != 'Laptops']