我有一個Excel電子表格中公司信息的大名單。我需要將公司信息放入我的程序中進行處理。python生成器可以像字典一樣工作嗎?
每家公司都有一個獨特的標籤,用於訪問公司。我可以使用標籤作爲鍵和公司信息作爲值創建字典,例如{label1: company1, label2: company2, ...}
。通過這樣做,字典創建時,會消耗太多的內存。
是否可以創建一個可以像字典一樣使用的生成器?
我有一個Excel電子表格中公司信息的大名單。我需要將公司信息放入我的程序中進行處理。python生成器可以像字典一樣工作嗎?
每家公司都有一個獨特的標籤,用於訪問公司。我可以使用標籤作爲鍵和公司信息作爲值創建字典,例如{label1: company1, label2: company2, ...}
。通過這樣做,字典創建時,會消耗太多的內存。
是否可以創建一個可以像字典一樣使用的生成器?
您可以創建一個類,覆蓋__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'
假設你正面臨着被訪問鍵 - 問題來自csv文件的價值結構化數據,您有3個選項:
看來問題的主要目標是有一個對象,行爲像一本字典,而無需在RAM中字典的內容(OP:「通過做這種方式,在創建字典時,它吃掉了太多的記憶。「)。這裏的一個選擇是使用模仿Python字典API的sqlitedict,並使用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'
@JoshLee:在OP明確指出,他希望避免創建字典... –
你可以給你的處理是關於什麼的更多的上下文。也許你完全不需要字典 –
你可以使用'__getitem__'方法創建一個對象,當你調用'mydata [...]'時,如果這就是你想要的,那麼這個方法就會顯示出來。 – khelwood