2013-05-03 126 views
2

如何在Python中動態填充字典?例如,假設我想創建一個包含列表格式文本文件數據的字典。假設我創建一個APR發生器,和我有一個存儲某些數據的各個單子如下(收益四捨五入到一些任意值):動態填充python字典

Neighborhood Income  Risk_Factor APR 
Brighton  20000  10    .196 
Allston   28500  3    .094 
... 

現在以後,我想做一個查找字典某個人:

Herman  Allston  25000 5 

現在,我想查找APR從字典中收取他們的費用。它將被檢查:

apr_charge["Allston"][25000][5] = 0.125 

我將如何動態創建此字典?現在,假設我有另一份保險文件,但現在我沒有考慮收入。所以我會用相同的代碼填寫相同類型的字典,但現在我有一個較少的嵌套字典密鑰。這可能嗎?我想創建嵌套字典,而不必事先知道嵌套的深度。

編輯: 我知道一個數據庫可以用來存儲這些信息。我想知道是否可以在不使用數據庫的情況下處理此問題。如果不可能,我需要一個可以存儲到內存中的輕量級數據庫。 (越少依賴頭痛,就更好了。我沒有對這個計劃將是對運行環境的完全控制。)

+0

確實['csv.DictReader'(http://docs.python.org/library/csv.html#csv檢查四月.DictReader)看起來有用嗎? – 2013-05-03 21:38:53

+0

爲什麼不使用元組的元組來替代?這將消除對嵌套字典的需求。 – FastTurtle 2013-05-03 21:43:40

回答

4

使用的數據庫。這比你想象的要容易。

sqlite將是一個不錯的選擇:

  1. 將不會有任何額外的依賴,因爲sqlite Python自帶。
  2. 數據庫將允許更容易獲得比嵌套類型的字典更加靈活 查詢。例如,你可以問,什麼 街區有risk_factor> 8?或什麼(鄰居, 收入,risk_factor)元組有APR < 0.10。
  3. 你的數據可以住在一個文件,並在可能被其他程序讀取 的格式,甚至用其他 比Python語言編寫的程序。
  4. 只要您不希望很多用戶試圖同時讀取或寫入您的數據庫 ,那麼對於此任務,sqlite應該是相當令人滿意的 。
  5. 的sqlite3的數據庫適配器具有excellent documentation並符合Python Database API Specification v2.0
  6. SQLite可以理解的SQL語言有excellent documentation

下面是一些例子:

要創建數據庫表:

import sqlite3 

with sqlite3.connect('apr.sqlite') as connection: 
    cursor = connection.cursor() 
    cursor.execute('''CREATE TABLE aprtable 
         (id INTEGER PRIMARY KEY AUTOINCREMENT, 
         neighborhood TEXT, 
         income INTEGER, 
         risk_factor INTEGER, 
         apr FLOAT)''') 

或者,在只讀存儲器創建數據庫:

with sqlite3.connect(':memory:') as connection: 
    .... 

將數據插入到表:

sql = 'INSERT INTO aprtable (neighborhood, income, risk_factor, apr) value (?,?,?,?)' 
args = ['Brighton', 20000, 10, 0.196] 
cursor.execute(sql, args) 

還檢查了executemany方法。

要找到給鄰里,收入和risk_factor年利率:

sql = 'SELECT apr FROM aprtable WHERE neighborhood = ? and income = ? and risk_factor = ?' 
args = ['Allston', 25000, 5] 
cursor.execute(sql, args) 
row = cur.fetchone() 
if row is not None: 
    apr = row[0] 

要改變給鄰里,收入和risk_factor的四月:

sql = 'UPDATE aprtable SET apr = ? WHERE neighborhood = ? and income = ? and risk_factor = ?' 
args = [0.125, 'Allston', 25000, 5] 
cursor.execute(sql, args) 

要了解什麼鄰里有risk_factor> 8:

sql = 'SELECT neighborhoods from aprtable where risk_factor > ?' 
args = [8] 
cursor.execute(sql, args) 
neighborhoods = cur.fetchall() 

要查找(居委會,收入,risk_factor)■有APR < 0.10:

sql = 'SELECT neighborhood, income, risk_factor FROM aprtable WHERE apr < ?' 
args = [0.10] 
cursor.execute(sql, args) 
for neighborhood, income, risk_factor in cursor: 
    print(neighborhood, income, risk_factor) 
2

基本上,只要使串鑰匙,然後進行數值其他任何你想存儲。

myDict = {} 
for i in lines: 
    myDict[i[0]] = lines[1:-1] 

這種方式,你可以通過使用

myDict["Allston"][2]