动态填充python字典

时间:2013-05-03 21:32:51

标签: python dictionary nested

如何在Python中动态填充字典?例如,假设我想创建一个包含表格式文本文件的数据的字典。假设我正在创建一个APR生成器,并且我有一个单独的特征列表,其中存储的某些数据如下(收入四舍五入到某个任意值):

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

如何动态创建此词典?如同,现在假设我有另一个保险档案,但现在我没有考虑收入。所以我用相同的代码填写相同类型的字典,但现在我有一个较少的嵌套字典键。这可能吗?我想创建嵌套字典,而不需要先了解嵌套的深度。

编辑: 我意识到可以使用数据库来存储这些信息。我想知道是否可以在不使用数据库的情况下处理这个问题。如果不可能,我需要一个可以存储到内存中的轻型数据库。 (依赖性头痛越少越好。我无法完全控制该程序将在其上运行的环境。)

2 个答案:

答案 0 :(得分:4)

使用数据库。它比你想象的要容易。

sqlite将是一个不错的选择:

  1. sqlite附带Python以来,没有额外的依赖。
  2. 数据库可以让您更灵活地访问 查询比嵌套dicts。例如,你可以问,什么 邻域有一个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
  7. 以下是一些例子:

    创建数据库表:

    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的apr:

    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]
    

    要改变给定社区,收入和风险因素的apr:

    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()
    

    要找到(邻域,收入,风险因素)具有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)
    

答案 1 :(得分:2)

基本上,只需将字符串作为键,然后将值设置为您想要存储的任何其他值。

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

这样,您只需使用

即可查看apr
myDict["Allston"][2]