在Python中处理这个问题的更好方法是什么

时间:2009-12-17 01:03:48

标签: python

简单的问题,我已经解决了..但是python有一百万种方法来解决同样的问题。我不想要最简洁的解决方案,我只想要一个比以下更有意义的解决方案:

# 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 a中的值来索引字典。应该指向另一个带有两个键/值对的字典来描述...除非有更聪明/更短的方法来做。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

正如Nadia所提到的,在处理查询结果时,元组扩展非常方便。在这种情况下,她的dict()表达式非常好,但是对于其他查询,当你需要对结果执行不同的操作时,只需在for循环中使用元组扩展:

for a, b, c in rows:
   # do something

答案 2 :(得分:-2)

您可能希望使用ORM来抽象数据库。我无法从这么短的片段中确定一下,但是看起来你的数据可能适用于ORM,如果你打算用它来构建一个字典。

我最喜欢的三个ORM:Django中的一个(易于使用,最适合常规数据),SQLAlchemy(如果您的数据库具有复杂模式,则是最佳选择),Autumn 3}}(小而简单,非常适合与SQLite一起使用)。