python生成器可以像字典一样工作吗?

时间:2017-03-22 15:11:30

标签: python dictionary generator

我在excel电子表格中有一个很大的公司信息列表。我需要将公司信息带入我的程序中进行处理。

每家公司都有一个独特的标签,用于访问公司。我可以使用标签作为键创建字典,使用公司信息作为值,例如{label1: company1, label2: company2, ...}。通过这种方式,当创建字典时,它会占用太多内存。

是否可以创建一个可以像字典一样使用的生成器?

3 个答案:

答案 0 :(得分:1)

假设您遇到的问题是从csv文件访问键值结构化数据,您有3个选项:

  1. 将整个数据加载到字典中,将其作为一个整体复制到RAM中,然后具有快速,持续的访问时间。这就是你说你想避免的。
  2. 每次要通过密钥访问数据时逐行搜索数据。这没有任何内存开销,但每次需要扫描整个文档,具有线性访问时间。
  3. 使用或复制数据到一些数据库引擎(或任何键值存储),它支持基于磁盘的索引,允许持续时间访问,而不需要先将数据加载到内存中。

答案 1 :(得分:1)

这个问题的主要目标似乎是让一个行为的对象像字典一样,没有字典的内容在RAM中(OP:"通过这样做)这样,当创建字典时,它会占用太多内存。")。这里的一个选择是使用sqlitedict,它模仿Python字典API,并在底层使用Sqlite数据库。

以下是当前文档中的示例:

>>> # using SqliteDict as context manager works too (RECOMMENDED)
>>> with SqliteDict('./my_db.sqlite') as mydict:  # note no autocommit=True
...     mydict['some_key'] = u"first value"
...     mydict['another_key'] = range(10)
...     mydict.commit()
...     mydict['some_key'] = u"new value"
...     # no explicit commit here
>>> with SqliteDict('./my_db.sqlite') as mydict:  # re-open the same DB
...     print mydict['some_key']  # outputs 'first value', not 'new value'

答案 2 :(得分:0)

您可以创建一个覆盖__getitem__方法的类。像:

class Foo:

    def __getitem__(self,key):
        # ...
        # process the key
        # for example
        return repr(key)

现在,如果您创建Foo

>>> somefoo = Foo()
>>> somefoo['bar']
"'bar'"
>>> somefoo[3]
'3'

所以语法上它有点“像字典一样”。

您还可以使用send 生成器,如演示in this answer

def bar():
    while True:
        key = yield
        # process the key
        # for example
        yield repr(key)

并将其命名为:

>>> somebar = bar()
>>> next(somebar)
>>> somebar.send('bar')
"'bar'"
>>> next(somebar)
>>> somebar.send(3)
'3'