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

この辞書を動的に作成するにはどうすればよいですか? たとえば、保険に関する別のファイルがあるとしますが、ここでは収入は考慮していません。したがって、同じタイプの辞書に同じコードを入力しますが、ネストされた辞書キーが 1 つ少なくなりました。これは可能ですか?ネストの深さを事前に知らなくても、ネストされた辞書を作成したいと考えています。

編集:データベースを使用してこの情報を保存できることを認識しています。データベースを使用せずにこれを処理できるかどうかを知りたかったのです。それが不可能な場合は、メモリに保存できる軽量のデータベースが必要です。(依存関係の問題が少ないほど良いです。このプログラムが実行される環境を完全に制御することはできません。)

4

2 に答える 2

4

データベースを使用します。思ったより簡単です。

sqliteは良い選択です:

  1. sqlitePython が付属しているため、余分な依存関係はありません。
  2. データベースを使用すると、ネストされた辞書よりも柔軟なクエリに簡単にアクセスできます。たとえば、risk_factor が 8 を超える近隣地域はどれかを尋ねることができます。または、どの (近隣、収入、リスク係数) タプルが 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 に答える