【问题标题】:Dictionary too big, keys are tuples... options?字典太大,键是元组......选项?
【发布时间】:2013-10-19 23:23:25
【问题描述】:

程序获取一个单词列表(70)并制作一个字典。键是元组中的单词序列,其中最后一个字母是下一个字母的第一个字母;该值是以键的最后一个字母开头的剩余单词的列表。

示例:

words= ['boy', 'young', 'star', 'grate']

d1={('boy'):['young'], ('young'):['grate'], ('star'):[], ('grate'):[]}

d2={('boy', 'young'):['grate']}

d3={('boy', 'young', 'grate'):[]}

我递归地制作越来越长的这些单词链

d3=makedic(d2,d1)
d4=makedic(d3,d1)
d5=makedic(d4,d1)

等等……

因为每个单词只能使用一次,。但是当我达到 d15 时,它最终会逐渐变细

len(d15)
741793
d16=makedic(d15,d)
Killed

我假设我的内存不足,我不能使用 db,因为键是元组,有什么想法可以继续吗?

【问题讨论】:

  • 制作下一个后是否需要保留较早的字典?如果没有,只需del 他们,或者,更好的是,只使用一个变量并继续将makedic 的结果分配给它。
  • 是的,我做到了。它最初停在 13 点。
  • 你可能有太多的可能性要管理:对于一组只有 30 个单词的情况,我在一个案例中有 1856284 个链(诚然,这是一个异常大的数字)。在一个 34 字的案例中,我有 2978802 个序列,只是以“成功”开头。
  • 我想这个词的选择很重要,我用的词是ling.gu.se/~lager/python_exercises.html上的 pokemon #45@

标签: python-2.7


【解决方案1】:

节省一些内存的一种简单方法可能是将索引存储到单词而不是单词本身。例如,在句子“The quick brown fox jumped over the lazy dog”中,您可以将 ("jumped", "dog") 表示为 (5, 9),因为它们是字符串中的第 5 个和第 9 个单词。

更一般地说,我想知道您是否真的需要超越两个词的情况,因为每个三个词的组合都必须作为两个两个词的组合存在,对吗?您可能不需要存储这些较大的组合,只需根据需要生成它们。

【讨论】:

  • 那是天才,谢谢,在你提到它之后,我可以不使用整数,而是将每个单词切割成第一个和最后一个字母;解决后,它在 16 之后逐渐变细,所以我只需要多一点空间。我实际上走的是轻松的路,在 amazon aws 上租了一个 X-large 实例 10 分钟。最长的链是 23 个字(有少于 2000 个不同的链)我正在解决的问题是 @987654321 上的 #45@
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 2011-10-03
  • 2013-06-06
  • 2022-10-05
  • 2011-06-20
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多