2009-12-17 7 views
0

간단한 문제입니다. 해결되었지만 파이썬에는 같은 문제를 해결하는 백만 가지 방법이 있습니다. 가장 간결한 솔루션을 원하지 않습니다. 단지 다음보다 더 의미가있는 솔루션을 원합니다.파이썬에서 이것을 처리하는 더 좋은 방법은 무엇입니까?

# sql query happens above, returns multiple rows 
rows = cursor.fetchall() 
cursor.close() 
cntdict = {} 
for row in rows: 
    a, b, c = row[0], row[1], row[2] 
    cntdict = { 
     a : { "b":b, "c":c } 
    } 
print dict(cntdict) 

참고 : a는 항상 위에서 유일합니다. 결과 집합에서 만든 사전이 필요합니다. 나중에 스크립트에서 발생한 각 행에 대해 사전의 값을 참조해야합니다. var에서 값을 키로하여 사전을 인덱싱하려고합니다. 더 똑똑한/짧은 방법이 없다면 ...를 설명하는 두 개의 키/값 쌍이있는 다른 사전을 가리켜 야합니다.

답변

12

당신은 발전기 표현 사전 생성자와 같은 일을 수행 할 수 있습니다 여기

dict((row[0], {"b": row[1], "c": row[2]}) for row in rows) 

그리고 것은 행동의 코드입니다 :

>>> rows = [[1, 2, 3], [4, 5, 6]] 
>>> dict((row[0], {"b": row[1], "c": row[2]}) for row in rows) 
{1: {'c': 3, 'b': 2}, 4: {'c': 6, 'b': 5}} 

MySQLdb 행을 반환하는 경우 내가 기억할 수없는 튜플 목록으로이 경우 다음과 같이 할 수 있습니다.

dict((a, {"b": b, "c": c}) for a, b, c in rows) 
+0

+1 빌어 먹을 좋은 –

+0

S/목록입니다 : 다른 쿼리를 그냥 for 루프에서 튜플 확장을 사용 결과에 뭔가 다른 일을해야 할 때 비록 그녀의 DICT() 표현은,이 경우 정말 좋네요 이해/발전기 표현/ –

+0

감사 네드, 수정. –

-2

loo k를 ORM을 사용하여 데이터베이스를 추상화합니다. 나는 짧은 발췌문에서 확실하게 말할 수는 없지만 어쨌든 당신이 그걸 사용하여 사전을 작성하려고한다면 ORM으로 데이터가 잘 작동하는 것처럼 보입니다.

내 세 마음에 드는으로 ORMs

는 : Django의 하나는, SQLAlchemy (데이터베이스가 복잡한 스키마가있는 경우 최선의 선택), 작고 간단하고 사용하기에 이상적 Autumn ((사용하기 쉽고, 정기적 인 데이터를 가장 잘 작동합니다) SQLite 포함).

0

나디아가 언급했듯이 튜플 확장은 쿼리 결과로 작업 할 때 매우 편리합니다.

for a, b, c in rows: 
    # do something 
관련 문제