【问题标题】:How to change dictionary from one format into another?如何将字典从一种格式更改为另一种格式?
【发布时间】:2013-10-22 16:34:09
【问题描述】:

我很确定这是一个 n00b 问题,但我似乎无法弄清楚。任何帮助表示赞赏。

我有一个生成一系列文件的应用程序,每个文件中都有一个字典,格式如下:

{date1:{key1:result1, key2:result2},date2:{key2:result3}}

我想计算每个值的每日平均值。因此,我想为每个唯一键创建一个字典,以汇总所有文件的结果:

unique_key_dict = {date1:[file1_result, file2_result],date2:[file1_result, file2_result]}

我不会提前知道键的名称或会有多少个唯一键,尽管在我的整个数据集中它不会超过 25 个唯一键,并且出于速度原因,我只想打开每个归档一次。

如何在 Python 中编写以下代码?

for date in file_dict:
    for key in file_dict[date]:
        # if key_dict does not exist from a previous file or date, create it
        # once the dictionary exists, append this value to the list tied to the date key.

我似乎无法弄清楚如何使用键名动态创建字典。如果我动态打印他们的名字,我会使用"dict_for_%s" % key,但我不是在尝试打印,而是在尝试创建字典。

另外,我可以只创建一个庞大的字典...哪个更快?一个庞大的字典还是 15-25 个单独的字典?

【问题讨论】:

  • 你是如何将字典存储在文件中的?
  • 只是 JSON。这是一个示例:{"2013-05-07T07:00:00+0000": {"recommended_pages": 1}, "2013-04-19T07:00:00+0000": {"page_profile": 1}, "2013-01-07T08:00:00+0000": {"mobile": 2, "page_profile": 1}}
  • 您是否正在尝试创建一个名称类似于dict_for_whatever 的字典,即动态创建一个特定名称的对象?如果是这样,那不是一个好主意,您应该按照@forefinger 的建议做,并将其包装在一个字典中。
  • 是的,这就是我想要创造的。 @DSM 为什么这是个坏主意?我已经搜索过了,但在 Google 或 SO 中,我什至没有找到任何与我无关的东西,因为“为什么在 python 中动态创建对象是个坏主意”
  • 动态创建对象也不错。动态创建 names 是个坏主意。请参阅here,以及其中的链接。在您制作完这些对象后,您打算如何引用它们?要么你硬编码每个名字并且有很多重复,要么你将不得不将它们存储在某种结构中以便像列表或字典一样循环。但无论哪种情况,动态创建名称都无济于事。你认为这样做会让你不再使用 dict 吗?

标签: python-2.7 dictionary


【解决方案1】:

这只是其中的一部分:

unique_key_dict = {}
for date in file_dict:
  for key in file_dict[date]:
    if date not in unique_key_dict: unique_key_dict[date] = []
    unique_key_dict[date].append(file_dict[date][key])

也许你想要

unique_key_dict = {}
for date in file_dict:
  for key in file_dict[date]:
    if key not in unique_key_dict: unique_key_dict[key] = {}
    if date not in unique_key_dict[key]: unique_key_dict[key][date] = []
    unique_key_dict[key][date].append(file_dict[date][key])

然后你有一个字典,它将每个键映射到一个字典,这些字典将日期映射到值数组。

之后获得平均值:

for key in unique_key_dict:
  for date in unique_key_dict[key]:
    avg = sum(float(x) for x in unique_key_dict[key][date]) / len(unique_key_dict[key][date])
    print key, date, avg

【讨论】:

  • 是的,但是如何生成 unique_key_dict 部分以进行测试?
  • 首先,非常感谢您的帮助!但是,这只会创建一个 unique_key_dict,当我想为每个唯一键创建单独的字典时......几乎就像 "dict_for_%s" % key 但我没有打印,我正在尝试生成字典。
  • 这不是你上面写的。为什么要这么多字典?
  • 呃,我特意写了:我想算出每个值的日均值。所以我想为每个唯一键创建一个字典,聚合所有文件的结果。我可以创建一个巨大的字典,但我很好奇如何以这种方式来做。我不知道一个大容量的字典是否会更有效率。唯一键的总数不应超过 25 个
  • 如果你想对文件进行一次传递,无论如何你都会一次将所有 25 个字典保存在内存中,所以内存使用量应该是相同的。
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多