2015-04-27 2 views
0

я функция определена, которая извлекает нужное значение из моей JSON строкиПолучение нескольких значений из JSON

2 Части вопрос:

def galPrice(commodity): 
    comPrice = [item['meanPrice'] for item in data['lastStarport']['commodities'] 
     if item['name'] == commodity] 
print json.dumps(comPrice) 

Вопрос 1:

Значения возвращенного функция дает мне [378], как бы вернуть название изделия, а также значение, то есть [meanPrice : 378]

Вопрос 2:

Из этого примера я пытаюсь напечатать несколько выбранных значений, таких как meanPrice, buyPrice и sellPrice

поэтому выход дал бы мне:

[meanPrice : 378], 
[buyPrice : 224], 
[sellPrice : 209] 

Единственный способ, которым я могу понять это является делая следующее, я не уверен, что это самый эффективный способ сделать это.

def galPrice(commodity): 
    meanPrice = [item['meanPrice'] for item in data['lastStarport']['commodities'] 
     if item['name'] == commodity] 
    buyPrice = [item['buyPrice'] for item in data['lastStarport']['commodities'] 
     if item['name'] == commodity] 
    sellPrice = [item['sellPrice'] for item in data['lastStarport']['commodities'] 
     if item['name'] == commodity] 
    print 'Mean Price:', meanPrice 
    print 'Buy Price:', buyPrice 
    print 'Sell Price:', sellPrice 

JSON:

{"lastStarport":{"id":"3230614016","name":"Vries Installation","faction":"Independent","commodities":[{"id":"128049204","name":"Explosives","cost_min":300,"cost_max":456,"cost_mean":"378.00","homebuy":"60","homesell":"56","consumebuy":"4","baseCreationQty":368,"baseConsumptionQty":0,"capacity":3868,"buyPrice":224,"sellPrice":209,"meanPrice":378,"demandBracket":0,"stockBracket":2,"creationQty":3868,"consumptionQty":0,"targetStock":3868,"stock":2166,"demand":0,"rare_min_stock":"0","rare_max_stock":"0","market_id":null,"parent_id":null,"statusFlags":[],"categoryname":"Chemicals","volumescale":"1.1400"}]}} 

ответ

0

Вы можете также использовать вспомогательную функцию

def get_commodity_data(commodity): 
    for item in data['lastStarport']['commodities']: 
     if item['name'] == commodity: 
      return item 
    return None 

def galPrice(commodity): 
    comdata = get_commodity_data(commodity) 
    return { 
     'meanPrice': comdata['meanPrice'], 
     'buyPrice': comdata['buyPrice'], 
     'sellPrice': comdata['sellPrice'], 
    } 

print galPrice('Explosives') 

Выходы

{'sellPrice': 209, 'meanPrice': 378, 'buyPrice': 224} 

I подумайте, что этот код должен отвечать 1) и 2). Если нет, прокомментируйте ниже, и я уточню.


Если бы не жесткий код требуемых значений, ниже является гораздо более гибким

def galPrice(commodity, values): 
    comdata = get_commodity_data(commodity) 
    return dict(zip(values, [comdata[value] for value in values])) 

print galPrice('Explosives', ['meanPrice', 'buyPrice', 'sellPrice']) 

Это дает тот же результат, что и выше.


Учитывая многочисленные товары с таким же именем, следующий не даст список данных для каждого товара

def galPrice(commodity, values): 
    comdata = filter(lambda i: i['name'] == commodity, 
        data['lastStarport']['commodities']) 
    return [dict(zip(values, [com[value] for value in values])) 
      for com in comdata] 

Примечание: это больше не требует вспомогательной функции. Это утилиты встроенной функции filter() и lambda expression.

Сначала список фильтруется только для тех элементов, которые имеют требуемое имя. Затем требуемые значения вытягиваются из указанных элементов.

Пример вывода:

[{'sellPrice': 209, 'meanPrice': 378, 'buyPrice': 224}, 
    {'sellPrice': 210, 'meanPrice': 378, 'buyPrice': 224}] 

Или, если вы очень удобный синтаксис списка понимания:

def galPrice(commodity, values): 
    return [dict(zip(values, [com[value] for value in values if com['name'] == commodity])) 
      for com in data['lastStarport']['commodities']] 

С таким же выходом, как описано выше.

+0

Благодарим вас, это то, чего я хотел достичь, поэтому, казалось бы, имя элемента 'meanPrice' будет введено вручную. Спасибо за быстрый ответ. – Marct

+1

@Marct см. Мое обновление для более гибкого решения, если вы предпочитаете не записывать требуемые значения для вывода – enigma

+0

. Спасибо, это будет очень полезно – Marct

Смежные вопросы