【问题标题】:Optimum data structure to save many dictionaries with different keys使用不同键保存许多字典的最佳数据结构
【发布时间】:2018-12-05 19:14:51
【问题描述】:

问题是保存一个字典用于数据分析,以便它可以扩展。 我正在执行 10000 次搜索,并根据结果为每个查询保存一个字典。最后,我得到了如下的字典:

{
'query_1' : {'has_result': True (or False),
             'direct_result': True (or False),
             'title': "title_1",
             'summary': "summary_1",
             'infobox': {'header_11': "data_11",
                         'header_12': "data_12",
                          .
                          .
                          .
              }
'query_2' : {'has_result': True (or False),
             'direct_result': True (or False),
             'title': "title_2",
             'summary': "summary_2",
             'infobox': {'header_21': "data_21",
                         'header_22': "data_22",
                          .
                          .
                          .
              }
.
.
.
}

有问题的部分显然是“信息框”。我不知道每个“信息框”会得到多少个键值对(通常不超过 50 个)。并且每个信息框的键都应该不同。

目前,我只能想到以下方法将数据保存为csv。

+---------+------------+---------------+---------+-----------+----------------+--------------+
|  query  | has_result | direct_result |  title  |  summary  | infobox_header | infobox_data |
+---------+------------+---------------+---------+-----------+----------------+--------------+
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_1       | data_1       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_2       | data_2       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_3       | data_3       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_4       | data_4       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_5       | data_5       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_1       | data_1       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_2       | data_2       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_3       | data_3       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_4       | data_4       |
+---------+------------+---------------+---------+-----------+----------------+--------------+

我的解决方案的问题是,'title' 和 'summary' 是一个字符串变量。对于 10000 个查询,这没什么大不了的。我最终得到大约 200,000 行。但我只是在想,从理论上讲,这是保存这本字典以进行数据分析的最佳方式。

如果将来我使用 100,000 或 1,000,000 个查询怎么办?你将如何解决这个问题?你会从一开始就使用不同的数据结构吗?以及如何为数据分析做好准备?

【问题讨论】:

  • 您到底想“优化”什么?文件大小? IO时间?

标签: python dictionary data-structures


【解决方案1】:

对于使用 Python 进行数据分析,最好的选择可能是使用类。值得庆幸的是,有提供此功能的 3rd 方库,例如 Pandas

以下解决方案使用@MaxU's explode recipe

import pandas as pd

# construct dataframe from dictionary of dictionaries, d
df = pd.DataFrame.from_dict(d, orient='index').rename_axis('query').reset_index()

# extract header & data, drop infobox
df['header'] = df['infobox'].map(list)
df['data'] = df['infobox'].map(lambda x: list(x.values()))
df = df.drop('infobox', 1)

# expand dataframe
res = explode(df, ['header', 'data'])

print(res)

     query  has_result  direct_result    title    summary     header     data
0  query_1        True          False  title_1  summary_1  header_11  data_11
1  query_1        True          False  title_1  summary_1  header_12  data_12
2  query_2       False           True  title_2  summary_2  header_21  data_21
3  query_2       False           True  title_2  summary_2  header_22  data_22

存储的选择是一个广泛的问题,取决于您的用例、要求、现有基础架构等。通常,您可能会发现 Pickle 和 HDF5 就足够了; HDF5 提供便携性优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 2012-04-18
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2011-01-14
    相关资源
    最近更新 更多