【问题标题】:How to store large integer value in value of key: value pairs of dictionary in python?如何在键值中存储大整数值:python中字典的值对?
【发布时间】:2020-02-11 16:08:41
【问题描述】:

我有一个字符键和整数值的 python 字典。我想将任意大的整数存储为我的键值。我可以在字典中作为键值存储的最大整数是多少?是否可以在初始化时定义字典的数据类型? 例如在 C 中,我们使用map<string, long long int>。在python中声明同一个字典应该怎么做?

例如,在下面的代码中,我的值会因许多键而大幅增长。

 for w in words:
     ngrams_w = self.word_to_ngrams(w)
        for n in ngrams_w:
            if n in lookup_table:
                lookup_table[n] = lookup_table[n] + 1
            else:
                lookup_table[n] = 1
     return lookup_table

现在我的语料库中有太多单词,导致三元组太多。那么,我的查找表中的值是否能够容纳非常大的整数?

【问题讨论】:

  • 你有没有尝试过或者只是来这里问问?
  • 使用sys.maxint返回Python常规整数类型支持的最大正整数
  • @SuperStew,我将字母 tri-grams 的计数存储在这样的字典中。现在我的语料库真的很大,所以计数值当然会很高。因此,当我在大型语料库上执行此操作时,我得到的最终字典包含所有垃圾键/值。所以我想知道是否有任何方法可以将这些大计数存储在我的字典中。
  • @Ch3steR "使用 sys.maxint 返回 Python 常规整数类型支持的最大正整数。" - 不,它返回 AttributeError: module 'sys' has no attribute 'maxint' ;)

标签: python python-3.x dictionary


【解决方案1】:

Python 整数可以任意大 - 它们可以占用的字节数仅受可用内存的限制。因此,您可以在字典中存储非常大的整数,就像任何其他类型的变量一样。

还要注意,python 的类型在幕后。同样的dict 几乎可以使用任何东西作为键,也可以使用任何东西作为对应的值。无需提前申报。

例如:

large_dict = {
   'a': 2**99**2,
   'b': 3**99**2,
   'c': 4**66**3,
   'd': 5,
}

print(large_dict['a'])
# 24830616513292456149616454036974739771820938966442197939419359658089567202400780743905571137028486156486036903513607264042124719153572110201314197883546916952215606391372422139042592773840794323335212159700095246665013394384789465765464293679828325113232950453141468484569985222217035575296458501452872186378717438026640856834533121910412608973480242085881672164719912544082874072107422434390554486837170594217552352179217838815153995983301946373496587090616156896354994345352377952726227907079690576457293694283595586693944067261016834086680506973471228878547284373711902581003346534526356682248040411471279547066667078693613059243075566078841931213128462480543351921983621089668275721435948101887626265184182951445127840725828830209648532962314294583129458462587616879683621002666459872557839185108646816817833525155517060333482860732993614665277625489415502061774379920496929429602780585502167079135606858316403456987934488806952870800041077801533837170751376374861251329800483795256882616805854878581164361680226869833419669385928257122731195573904839938024027782370149377710658645650280419249518679276644090004956974913792951678647959778713113374754349884308332520403967474904860378939613020574276565212696855826404212709820546399167642334178336428555942563152453083892489382421641854517289230831100263608004179956903465008511600241582320500793382331980382057875456793451053160479393167189744446997815108094874623772314046414880967888630771591139242793679368373241262303020403503806741495927267535782756256226464827679171453103936982984219779689528492725634758390287762884938541414982295293195059435820985171981953652126800809143528930914867233895403413631144957773050572055247562723249843368842707168818290935719822151262157837630513192298577647355462098479363787742148415773842359155842482339588691450667863720967596151398289089712023294064255959682719606426598201025203109875583565132643670912933398263577545142697715765285834571917043394759092957857788427530930354248022105571235052694964834870559303479169142265964947215835534331232659231738844605321566863791868404356910674470711233474169254178106049934124965008926126859691353260188518891725702238011978956872340932416194028852429366663313267993063866935339039988538965602564065890425970977641916796977494816019907846068887159081996367805130377827078940214763737954464021880895504378918548182271578043448659561293769460226209756884091241789271212624443566823618854822556818054950921281495213677124939344997301596883289597036555187701021490864067003001042353911716339896584757966357696031609808169050800581900702426733604379398309018563404211559969917703040652231206637777868534421416141767113165973592413599591681134708842927135950028572565259146431359982767414698579766187600152269764793150959658673104646366308004593390529802053032008317417654941763892718192450423219923744313363894743858416682079171193877076995395458797611449453319718948222265568320631084026777091936418337638425034752

这些应该符合“任意大整数”的条件,因为尝试打印它们会溢出我的终端窗口的大小,并且large_dict['c'] 尽管消耗了 StackOverflow 字符限制的六倍左右,但仍能正常显示。请注意,当您尝试将它们转换为 floating 点数时,可能会出现问题,因为它们有精度限制。


Python 确实支持“类型提示”,您可以在其中暗示变量的类型,但它实际上不会影响您可以对代码执行的任何操作。不管怎样,你会这样记:

# need to import Dict to type-hint about it
from typing import Dict

# hint that large_dict should use strings as keys and ints as values
# note that a 'character' is just a 1-length string, as far as python is concerned
# note also that this will not stop someone from putting a non-string in as a key, 
#   or a non-int in as a value
large_dict: Dict[str, int] = {
    ...
}

【讨论】:

  • 从您的回答看来,我可以存储任何我想存储在字典值中的整数,但是当我在非常大的语料库(如语料库)上运行上述代码时,我不知道出了什么问题数十亿字。在这种情况下,字母三元组的数量最多应该达到一万亿,所以它应该可以工作,但我不知道我的代码有什么问题?我觉得应该还有其他的bug,所以还是再看一遍代码吧。
  • 在这种情况下,字母三元组的数量最多应该达到一万亿,所以它应该可以工作,但我不知道我的代码有什么问题?我认为应该还有一些其他的错误,所以我最好再看一遍代码。我不是绿色斗篷指南,但是是的,数字的大小可能不是问题。
猜你喜欢
  • 2020-03-29
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2018-08-23
  • 2011-07-02
相关资源
最近更新 更多