2013-05-03 9 views
2

사전을 파이썬으로 동적으로 채우려면 어떻게해야합니까? 예를 들어, 표 형식의 텍스트 파일에서 데이터를 보유하는 사전을 만들고 싶다고 가정합니다.동적으로 파이썬 사전 채우기

Neighborhood Income  Risk_Factor APR 
Brighton  20000  10    .196 
Allston   28500  3    .094 
... 

지금 나중에, 내가 가진 조회를하고 싶은 : 내가 4 월 생성기를 만드는 오전, 및 (소득이 어떤 임의의 값으로 반올림)은 다음과 같이 내가 저장된 특정 데이터와 개별 특성의 목록이 있다고 가정 특정 개인 사전 :

Herman  Allston  25000 5 

이제는 사전에서 요금을 청구하기 위해 APR을 조회하고 싶습니다. 다음을 통해 확인할 수 있습니다.

apr_charge["Allston"][25000][5] = 0.125 

이 사전은 어떻게 동적으로 생성합니까? 마찬가지로, 보험에 대한 또 다른 파일이 있다고 가정 해 보겠습니다. 그러나 지금은 소득을 고려하지 않았습니다. 그래서 같은 코드로 같은 유형의 사전을 채울 것이지만, 이제 중첩 된 사전 키가 하나 더 생깁니다. 이것이 가능한가? 둥지가 얼마나 깊은 지에 대한 사전 지식없이 중첩 된 사전을 만들고 싶습니다.

편집 : 나는이 정보를 저장하는 데 데이터베이스를 사용할 수 있음을 알고 있습니다. 나는 데이터베이스를 사용하지 않고 이것을 처리 할 수 ​​있는지 알고 싶었다. 가능하지 않다면 메모리에 저장할 수있는 가벼운 데이터베이스가 필요합니다. (의존성 두통이 적 으면 적을수록 좋다.이 프로그램이 실행될 환경을 완전히 제어 할 수는 없다.)

+0

합니까 ['csv.DictReader'] (http://docs.python.org/library/csv.html#csv를 사용하여 4월를 확인하실 수 있습니다 .DictReader) look useful? –

+0

키 대신 터플을 사용하지 않는 이유는 무엇입니까? 그것은 중첩 된 사전의 필요성을 제거 할 것입니다. – FastTurtle

답변

4

데이터베이스를 사용한다. 생각보다 쉽습니다. sqlite 파이썬 함께 제공하기 때문에

  1. 여분의 의존성이 없을 것입니다 :

    sqlite

    는 좋은 선택이 될 것입니다.
  2. 데이터베이스는 중첩 된 dict보다 유연한 쿼리에 더 쉽게 액세스 할 수 있습니다. 예를 들어, 주변에 risk_factor> 8이 있는지 물을 수 있습니까? 또는 무엇을 (이웃, 소득, risk_factor) 튜플에 APR < 0.10이 있습니다.
  3. 데이터는 파일로 저장되고 다른 프로그램 ( )으로 읽을 수있는 형식 일 수 있으며 파이썬 이외의 다른 언어로 작성된 프로그램도 있습니다.
  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 주어진 4월를 확인하는 방법은 다음과 같습니다

sql = 'UPDATE aprtable SET apr = ? WHERE neighborhood = ? and income = ? and risk_factor = ?' 
args = [0.125, 'Allston', 25000, 5] 
cursor.execute(sql, args) 

무엇을 찾으려면 : 이웃, 소득과 risk_factor를 주어진 4월을 변경하려면

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> 8 :

sql = 'SELECT neighborhoods from aprtable where risk_factor > ?' 
args = [8] 
cursor.execute(sql, args) 
neighborhoods = cur.fetchall() 

은 (지역, 소득, risk_factor)의 사월 < 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]