Я делаю запрос к конечной точке и получаю ответ json в следующем формате.
r = requests.get(url)
print(r.json())
{"context":"product=fhvh, price=25,product=vfjvnf,price=37,product=fvfv,price=3.....}
Я хочу перебрать их и получить количество продуктов, цена которых превышает 22.
Как я могу это получить? Сначала я пытался перебрать ответ json, но я не верю, что это сработает из-за формата вывода. Есть ли лучшее решение? Как я могу сначала преобразовать ответ, возможно, в dict или tuple? Кто-нибудь может мне помочь. Спасибо.
@PraveenPremaratne Да, есть. Это скелет :- {"context":"product=fhvh, price=25,product=vfjvnf,price=37,product=fvfv,price=3.....}
Вы знаете, всегда ли они приходят парами? product=fhvh, price=25
@PraveenPremaratne Да, это всегда идет парами.
Похоже, этот вопрос больше касается обработки строк, а не JSON.
Все продукты уникальны?
@RichardDodson Да, все они уникальны.
Итак, ваш ответ приходит в виде неупорядоченного упорядоченного списка внутри строки без проверки (например, product=fhvh и т. д.)? Можете ли вы просто опубликовать фактический JSON?
@psychopg2 К сожалению, это фактические данные, которые я получаю.
У меня есть решение, но оно не идеальное, и я бы лично им не воспользовался.
@PraveenPremaratne Не могли бы вы поделиться им, пожалуйста?
Это наихудшее из возможных решений, оно основано на том, что ответ всегда имеет product
и price
и может быть очень ненадежным.
r = requests.get(url)
data = r.json()
context=data.get('context')
elements = context.split(',')
chunks=[elements[i:i + 2] for i in range(0, len(elements), 2)]
print(chunks)
[['product=fhvh', ' price=25'], ['product=vfjvnf', 'price=37'], ['product=fvfv', 'price=3']]
Я бы посмотрел на библиотеки обработки данных, используемые большими данными, такими как Pandas, у которых может быть более надежный способ сделать это.
r = requests.get(url)
data = r.json()
context=data.get('context')
elements = context.split(',')
chunks=[elements[i:i + 2] for i in range(0, len(elements), 2)]
print(chunks)
product_list = []
for item in chunks:
obj1=item[0].split('=')
obj2=item[1].split('=')
product = { obj1[0].strip(): obj1[1].strip(), obj2[0].strip(): float(obj2[1].strip())}
product_list.append(product)
print(product_list)
for product in product_list:
if product.get('price') > 22.0:
print(product)
Хммм, так вы преобразовали его в меньшие списки. Как я могу получить товар, цена которого больше 22?
У него всегда есть цена и продукт.
Это массив массивов... поэтому вы можете просто выполнить итерацию и построить другой массив, содержащий элементы, стоимость которых превышает определенную цену.
Да, если ответ предоставляет его в таком порядке. Так что, если ответ делает это product=fhvh, product=vfjvnf, price=25, price=37
, вы облажались.
Вот почему это очень ненадежно, вы верите в то, что API всегда будет последовательным.
Что ж, я все равно приму это как потенциальный ответ и посмотрю на панд.
Спасибо вам за помощь.
@Somethingwhatever проверьте обновление, оно должно работать.
Ваша проблема в том, что у вас есть полезная нагрузка не в формате JSON, а в каком-то альтернативном формате. Я бы посоветовал преобразовать каждую запись в context
в объект:
class Product:
def __init__(self, name, price):
self.name = name
self.price = float(price)
def parse_data(resp):
# First, read in the JSON
raw_data = r.json()
# Next, split the context field in the JSON into a list-of-tuples
# where each item represents a key and value.
parsed_data = [tuple(item.strip().split('=')) for item in raw_data["context"].split(',')]
# Finally, convert each product to our type and return the list of them
# This assumes that the payload contains a product followed by a price
return [Product([i][1], y[i + 1][1]) for i in range(0, len(y), 2)]
r = requests.get(url)
filtered = [product for product in parse_data(r) if product.price > 22]
Этот код подчиняется разделению ответственности и выдает желаемый результат (все продукты с ценой выше 22). При этом это в значительной степени зависит от предположений о том, что возвращается из API, который вы запрашиваете. Вы захотите добавить проверки данных, чтобы убедиться, что вы не получаете неверные данные.
Это выглядит намного лучше, чем у меня, но я бы оценил цену как float
. Может иметь десятичные дроби.
@PraveenPremaratne Я думаю, что это правильное замечание. На самом деле, я не думаю, что вообще анализировал значение.
Вы знаете структуру ответа? Можете ли вы предоставить скелет?