2

如何在 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

我将如何动态创建这个字典?如,现在假设我有另一个保险档案,但现在我不考虑收入。所以我会用相同的代码填写相同类型的字典,但现在我少了一个嵌套的字典键。这可能吗?我想在没有先验知识的情况下创建嵌套字典。

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

4

2 回答 2

4

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

sqlite将是一个不错的选择:

  1. sqlite因为Python 自带,所以不会有额外的依赖。
  2. 与嵌套字典相比,数据库将允许更轻松地访问更灵活的查询。例如,您可能会问,哪些社区的 risk_factor > 8?或者什么 (neighborhood, income, risk_factor) 元组的 APR < 0.10。
  3. 您的数据可以存在于文件中,并且采用其他程序可以读取的格式,即使是用 Python 以外的语言编写的程序。
  4. 只要您不希望有很多用户同时尝试读取或写入您的数据库,sqlite 应该可以很好地完成这项任务。
  5. sqlite3 数据库适配器具有出色的文档并符合Python 数据库 API 规范 v2.0
  6. SQLite 所理解的 SQL 语言具有出色的文档

这里有些例子:

创建数据库表:

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方法。

要找到给定社区、收入和风险因素的 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)
于 2013-05-03T22:03:22.337 回答
2

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

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

这样,您只需使用即可检查 apr

myDict["Allston"][2]
于 2013-05-03T22:33:21.287 回答