2010-08-08 112 views
0

我在该论坛阅读了很多,但我找不到合适的方式将所有项目添加到我的字典...所以也许有人可以帮助我! 首先解释一下:将项目添加到词典

rows = cur.fetchall() 
columns=[desc[0] for desc in cur.description] 
GID_Distances = {} 
if len(rows) > 0: 
    for row in rows: 
     items = zip(columns, row) 
     GID_Distances = {} 
     for (name, value) in items: 
     GID_Distances[name]=value 

行是一个sql语句列表。所以在这个列表中有几个值具有相同的键...我只想得到像 这样的东西: {['id':1,'point':2],['id':2 ,'point':3]} 但是对于上面的循环,结果只是最后一项,因为它覆盖了之前的所有内容。有任何想法吗????

+3

在迭代它之前,不检查列表的长度是否为非空。这在迭代它时是隐含的。 – aaronasterling 2010-08-08 10:35:15

+1

如果'cur'是一个db上的游标,那么你应该接受Kenny的答案 – 2010-08-08 12:43:26

+0

,那么可能有一种类似dict的游标。 – 2010-08-08 18:10:59

回答

2

您正在重新定义GID_Distances到循环中的空白字典,而无需先存储该值。排在列表中存储像这样:

rows = cur.fetchall() 
columns=[desc[0] for desc in cur.description] 
results = [] 
for row in rows: 
    GID_Distances = {} 
    items = zip(columns, row) 
    for (name, value) in items: 
    GID_Distances[name]=value 
    results.append(GID_Distances) 
+0

但发生此错误: NameError:全局名称'GID_Distances'未定义 – aleho 2010-08-08 10:44:13

+1

那么必须有一个输入错误。没有理由发生这种事情。例如,您正在访问'columns'就好了,它在与'GID_Distances'相同的块级定义。检查你的拼写在两个地方都是一样的。 – aaronasterling 2010-08-08 10:45:50

+0

不要认为有错字,因为它是相同的代码...我只是加了一个#... – aleho 2010-08-08 10:49:36

3

如果你有对即[(k1,v1),(k2,v2),...]的迭代,你可以申请dict它,使它的字典。因此,您的代码可以简写为

rows = cur.fetchall() 
columns = [desc[0] for desc in cur.description] 
# or: columns = list(map(operator.itemgetter(0), cur.description)) 
#  don't call list() in Python 2.x. 
GID_Distances = [dict(zip(columns, row)) for row in rows] 
# note: use itertools.izip in Python 2.x 
+0

+1忘了字典 – aaronasterling 2010-08-08 11:41:42

+0

这工作完美!呃,这么短...好极了! 所以,我会看看如果我可以继续... ...必须改变,因为我之前使用过字典! 感谢您的快速帮助,太棒了! – aleho 2010-08-08 11:46:09