按值获取字典的键

时间:2013-01-18 23:30:52

标签: python dictionary hashmap key-value

  

可能重复:
  Efficient bidirectional hash table in Python?

我正在研究一个解析python代码的AST解析器。首先,我通过调用compile将python代码转换为AST 在这样做时,我需要确保我不会两次编译相同的导入模块,即使有两个调用来导入它。

目前,我可以检测到这两个调用是等效的:

import modname as mod
import modname as mod

我维护了一个字典(在本例中为mod}映射到modname。我不仅用它来检测已经导入了modname,还用于其他一些记账功能。

现在,我无法检测到以下三个调用导入了同一个模块:

import modname as mod
import modname as foo
import modname

我知道我可以通过使用set来包含modname来轻松解决此问题,并在第二次编译modname之前检查此集。但是,这需要另一个线性空间块 我可以对字典进行线性传递,以检查是否有任何键映射到modname的值,但是这会破坏使用字典的目的。

因此我的问题是:是否存在一个“双向dict”的数据结构 - 一个将其键映射到值并且其值可以在O(1)时间查找的数据结构?< / p>

1 个答案:

答案 0 :(得分:0)

Python已在sys.modules中跟踪导入的模块。

每个键都是导入的模块名称(而不是导入它的别名),每个值都是具有该模块的全局命名空间的实际模块对象:

>>> import sys
>>> import os
>>> 'sys' in sys.modules
True
>>> 'os' in sys.modules
True
>>> sys.modules['sys'].__dict__.keys()
['setrecursionlimit', 'dont_write_bytecode', 'getrefcount', 'path_importer_cache', 'stdout', 'getprofile', '__stdin__', 'version_info', 'exc_clear', 'prefix', 'getfilesystemencoding', 'byteorder', '_clear_type_cache', 'excepthook', 'ps1', 'exc_type', '__excepthook__', 'executable', 'float_info', 'copyright', 'setdlopenflags', 'exec_prefix', 'getdlopenflags', 'getrecursionlimit', 'py3kwarning', 'path_hooks', '__package__', '_current_frames', 'platform', 'maxsize', 'version', 'exit', 'call_tracing', 'callstats', 'flags', 'setcheckinterval', '__doc__', 'api_version', '__plen', 'getdefaultencoding', 'getcheckinterval', 'maxunicode', 'settrace', 'setprofile', 'argv', '__stdout__', 'meta_path', '__name__', 'subversion', 'builtin_module_names', 'stdin', '__stderr__', '__egginsert', 'displayhook', 'ps2', 'gettrace', 'modules', 'warnoptions', 'last_type', 'getsizeof', 'last_traceback', 'maxint', '__displayhook__', '_getframe', 'stderr', 'exc_info', 'path', 'last_value', 'hexversion']