【问题标题】:Dynamically fill a python dictionary动态填充python字典
【发布时间】:2013-04-28 09:13:32
【问题描述】:

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

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

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

【问题讨论】:

  • csv.DictReader 看起来有用吗?
  • 为什么不使用元组作为键呢?这将消除对嵌套字典的需要。

标签: python dictionary nested


【解决方案1】:

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

sqlite 是个不错的选择:

  1. 不会有额外的依赖,因为sqlite 是 Python 自带的。
  2. 一个数据库将允许更容易访问更灵活 查询比嵌套字典。例如,你可以问,什么 社区的 risk_factor > 8?或者什么什么(邻里, income, risk_factor) 元组的 APR
  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 方法。

要找到给定社区、收入和风险因素的 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

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]
    

    这样,你就可以通过使用来查看apr了

    myDict["Allston"][2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2015-11-12
      • 2022-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多