2013-05-03 127 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]