2015-03-11 4 views
0

Я не могу понять, как искать в следующем списке/массиве (хранится в self._map_commodities), и данные получены из JSON.python как искать в многомерном массиве/list

Проблема: Я хочу, чтобы найти «дерево» в массиве и возвращает «размер» значение, связанное с ним

Я пытался использовать индекс(), но я не могу заставить его работать , T

class MyClass1(object): 

    def __init__(self): 
     self._data = '' 
     self.list_commodities = [] 
     self._map_commodities = [] 

    def create_commodity_market(self): 
     for commodity in self._data['commodities']: 
      self.list_commodities.append(commodity['id']) 
      self._map_commodities.append(commodity) 

    def from_json(self): 
     import json 
     self._data = json.loads('{"commodities":[{"id":"food","size":"1.0"},{"id":"wood","size":"1.0"},{"id":"ore","size":"1.0"},{"id":"metal","size":"1.0"},{"id":"tools","size":"1.0"}]}') 


x = MyClass1() 
x.from_json() 
x.create_commodity_market() 
print(x.list_commodities) 
print(x._map_commodities) 
####print(x._map_commodities.index("wood")) # I want it to print the size-value of the wood object 

Спасибо заранее.

+0

Что выход делает это возвращение сценария? – rth

+0

Вы должны предоставить нам метод _map_commodities – user3885927

+0

['food', 'wood', 'ore', 'metal', 'tools'] [{'id': 'food', 'size': '1.0'} , {'id': 'wood', 'size': '1.0'}, {'id': 'ore', 'size': '1.0'}, {'id': 'metal', 'size': '1.0'}, {'id': 'tools', 'size': '1.0'}] Мне нужен способ поиска/сопоставления идентификаторов (еда, дерево, руда, металл, инструменты) и вернуть «размер» связанных с ними. Я знаю, что каждый имеет размер: 1,0, но они могут быть разными. – haakoon

ответ

0

Словарь больше подходит для того, что вы пытаетесь сделать:

class MyClass1(object): 

def __init__(self): 
    self._data = '' 
    self._map_commodities = {} 

def create_commodity_market(self): 
    for commodity in self._data['commodities']: 
     self._map_commodities[commodity['id']] = commodity['size'] 

def from_json(self): 
    import json 
    self._data = json.loads('{"commodities":[{"id":"food","size":"1.0"},{"id":"wood","size":"1.0"},{"id":"ore","size":"1.0"},{"id":"metal","size":"1.0"},{"id":"tools","size":"1.0"}]}') 


x = MyClass1() 
x.from_json() 
x.create_commodity_market() 
print(x._map_commodities["wood"]) 
0

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

def from_json(self): 
     import json 
     self._data = json.loads('{"commodities":[{"id":"food","size":"1.0"},{"id":"wood","size":"1.0"},{"id":"ore","size":"1.0"},{"id":"metal","size":"1.0"},{"id":"tools","size":"1.0"}]}') 
     return self._data 

Затем используют индексацию, чтобы получить соответствующий size в виде word.for например:

x = MyClass1() 
d=x.from_json() 
print d['commodities'][1]['size'] 
u'1.0' 
+0

«return elf._data» должно быть «return self._data» – user3885927

+0

@ user3885927 yep. исправлено спасибо за напоминание! – Kasramvd

1

В основном то, что вам вы хотите:

print next(y['size'] for y in x._map_commodities if y['id'] == 'wood') 

Который выкинет StopIteration e xception, если ни один из ваших предметов не имеет идентификатора дерева.

В более общем плане, добавить метод, как это MyClass1:

def size_from_id(self, id_name): 
    try: 
     return next(y['size'] for y in self._map_commodities if y['id'] == id_name) 
    except StopIteration: 
     return None 

Тогда вы можете позвонить x.size_from_id('wood').

0

Вы можете использовать pandas для обработки данных

import json 
import pandas as pd 

data = json.loads('{"commodities":[{"id":"food","size":"1.0"},{"id":"wood","size":"1.0"},{"id":"ore","size":"1.0"},{"id":"metal","size":"1.0"},{"id":"tools","size":"1.0"}]}') 
df = pd.DataFrame.from_dict(data['commodities']) 

# get the size of the row with id = 'wood' 
size = df[df['id'] == 'wood']['size'] 
print size 

# you can get the value alone, too 
print size.values[0] 
Смежные вопросы