python如何在多维数组/列表中查找

python how to search in multidimensional array / list

后面的list/array(存储在self._map_commodities中)不知道怎么查找,数据是从JSON中获取的。

问题: 我想在数组中找到 "wood" 和 return 与之相关的 "size" 值

我试过使用 index(),但我无法让它工作。 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

提前谢谢你。

首先你需要return你函数的具体值:

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

然后使用索引获取 word.for 示例的相关 size :

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

基本上你想要的是:

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

如果您的 none 项的 ID 为 'wood',这将引发 StopIteration 异常。

更一般地说,将这样的方法添加到 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').

您可以使用 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]

字典更适合你的目的:

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"])