所以我试图将mysql中的数据提取到python字典中 这是我的代码。
def getAllLeadsForThisYear():
charges={}
cur.execute("select lead_id,extract(month from transaction_date),pid,extract(Year from transaction_date) from transaction where lead_id is not NULL and transaction_type='CHARGE' and YEAR(transaction_date)='2015'")
for i in cur.fetchall():
lead_id=i[0]
month=i[1]
pid=i[2]
year=str(i[3])
new={lead_id:[month,pid,year]}
charges.update(new)
return charges
x=getAllLeadsForThisYear()
当我打印时(len(x.keys())它给了我一些数字说450
当我在mysql中运行相同的查询时,它返回500行。虽然我在字典中确实有一些相同的键,但它应该计算它们,因为我没有提及它,如果我不在charges.keys()。如果我错了,请纠正我。 谢谢
答案 0 :(得分:1)
正如我所说,问题在于每次弹出重复键时,您都会在键上覆盖您的值。这可以通过两种方式解决:
例如:
#change these lines
new={lead_id:[month,pid,year]}
charges.update(new)
#to
if lead_id in charges:
charges[lead_id].extend([month,pid,year])
else
charges[lead_id] = [month,pid,year]
这给你一个像这样的结构:
charges = {
'123':[month1,pid1,year1,month2,pid2,year2,..etc]
}
使用这种方法,您可以通过将每个键的值按3(this may be useful)
的块分块来到达每个单独的条目然而,我并不喜欢这种方法,因为它需要你做那个分块。这让我接近2。
defaultdict from collections
,其行为与普通dict
完全相同,只是在您尝试调用尚未创建的密钥时默认值。例如:
#change
charges={}
#to
charges=defaultdict(list)
#and change
new={lead_id:[month,pid,year]}
charges.update(new)
#to
charges[lead_id].append((month,pid,year))
给你一个像这样的结构:
charges = {
'123':[(month1,pid1,year1),(month2,pid2,year2),(..etc]
}
使用这种方法,您现在可以使用以下内容遍历每个键的每个列表:
for key in charges:
for entities in charges[key]:
print(entities) # would print `(month,pid,year)` for each separate entry
如果您使用这种方法,请不要忘记from collections import defaultdict
。如果您不想导入外部,可以通过以下方式模仿:
if lead_id in charges:
charges[lead_id].append((month,pid,year))
else
charges[lead_id] = [(month,pid,year)]
这与第一种方法非常相似,但明确的“创建一个列表,如果密钥不在那里”defaultdict
将隐式执行。