2017-03-22 27 views
0

我有一個Excel電子表格中公司信息的大名單。我需要將公司信息放入我的程序中進行處理。python生成器可以像字典一樣工作嗎?

每家公司都有一個獨特的標籤,用於訪問公司。我可以使用標籤作爲鍵和公司信息作爲值創建字典,例如{label1: company1, label2: company2, ...}。通過這樣做,字典創建時,會消耗太多的內存。

是否可以創建一個可以像字典一樣使用的生成器?

+1

@JoshLee:在OP明確指出,他希望避免創建字典... –

+1

你可以給你的處理是關於什麼的更多的上下文。也許你完全不需要字典 –

+2

你可以使用'__getitem__'方法創建一個對象,當你調用'mydata [...]'時,如果這就是你想要的,那麼這個方法就會顯示出來。 – khelwood

回答

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' 
1

假設你正面臨着被訪問鍵 - 問題來自csv文件的價值結構化數據,您有3個選項:

  1. 將整個數據加載到字典中,然後將其作爲一個整體複製到RAM中,然後獲得快速,持續的訪問時間。這就是你說你想避免的。
  2. 每當您想要通過密鑰訪問數據時,逐行搜索數據。這沒有任何內存開銷,但每次都需要掃描整個文檔,具有線性訪問時間。
  3. 將數據使用或複製到某些支持基於磁盤索引的數據庫引擎(或任何鍵值存儲),允許恆定時間訪問,而不需要先將數據加載到內存中。
1

看來問題的主要目標是有一個對象,行爲像一本字典,而無需在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' 
相關問題