python数据结构建议?

时间:2016-11-06 22:35:59

标签: python data-structures

我有一个复杂的定价数据,比如树状结构

示例将类似于计算机价格(显示器价格,主板价格等),在显示器类别中我有更多的子类别,在这些子类别下我有更多的类别(显示器是27英寸,由戴尔制作,这是弯曲的)

我需要经常阅读这些定价信息(只读)数千次。

我想用class来存储这些信息。因为我不知道我是否可以在词典中做到这一点。有人有建议吗?

3 个答案:

答案 0 :(得分:1)

Mongodb肯定是一个很好的可能性,但在你的情况下,只有50个条目只读它可能是一种矫枉过正,特别是因为你需要熟悉如何进行查询。

更快捷的方式很可能是通过pandas:使用嵌套字典,最好创建一个输入JSON文件或字符串(如下例所示),然后在做一个pandas数据帧中读取它。

然后您可以按照自己的方式对其进行标准化,并在熊猫中进行必要的计算,您可以更快地学习:

这是一个如何看起来像的例子: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.io.json.json_normalize.html

>>> data = [{'state': 'Florida',
...          'shortname': 'FL',
...          'info': {
...               'governor': 'Rick Scott'
...          },
...          'counties': [{'name': 'Dade', 'population': 12345},
...                      {'name': 'Broward', 'population': 40000},
...                      {'name': 'Palm Beach', 'population': 60000}]},
...         {'state': 'Ohio',
...          'shortname': 'OH',
...          'info': {
...               'governor': 'John Kasich'
...          },
...          'counties': [{'name': 'Summit', 'population': 1234},
...                       {'name': 'Cuyahoga', 'population': 1337}]}]
>>> from pandas.io.json import json_normalize
>>> result = json_normalize(data, 'counties', ['state', 'shortname',
...                                           ['info', 'governor']])
>>> result
         name  population info.governor    state shortname
0        Dade       12345    Rick Scott  Florida        FL
1     Broward       40000    Rick Scott  Florida        FL
2  Palm Beach       60000    Rick Scott  Florida        FL
3      Summit        1234   John Kasich     Ohio        OH
4    Cuyahoga        1337   John Kasich     Ohio        OH

对于上述数据框,您可以轻松获得所有短名称=='FL'的条目的总和,如下所示:

sum_of_fl_population = result[result['shortname']=='FL'].population.sum()
Out[11]: 112345

查看此链接,了解如何处理pandas数据帧。这可能是解决问题的最佳方法。 http://pandas.pydata.org/pandas-docs/stable/10min.html

答案 1 :(得分:0)

我认为存储这些数据的好方法可能是拥有一个计算机对象,它可以有成员变量,如主板,监视器等。

然后,您可以拥有一个包含映射到计算机对象的唯一ID的字典。所以你可以有类似的东西

    computers.get('12345').getMotherBoard().getMake()
    computers.get('45678').getMonitor().getScreenResolution()
    computers.get('54342').getRam().getPrice()

答案 2 :(得分:0)

寻找大数据。

将ElasticSearch,MongoDB,CouchDB或其他许多内容(我猜)放入您的堆栈中,并将每个产品存储为文档,从而使您的基础变得扁平化。

为每种类型的文档创建一个索引(一个用于计算机屏幕,一个用于主板,......),基本上每个类型的对象有一个索引,它们共享相同的属性,您可以随时使用。

对于有关育儿的弹性搜索: https://www.elastic.co/guide/en/elasticsearch/guide/2.x/parent-child.html https://www.elastic.co/guide/en/elasticsearch/guide/2.x/parent-child-mapping.html

我相信这比SQL快,也许更容易使用。但是有一个缺点,没有多少框架允许您使用这样的“新”数据库。虽然为了更好地知道有带ORM的映射器