Python字典的密钥长度与mysql

时间:2015-12-11 17:39:52

标签: python mysql sql dictionary

所以我试图将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()。如果我错了,请纠正我。 谢谢

1 个答案:

答案 0 :(得分:1)

正如我所说,问题在于每次弹出重复键时,您都会在键上覆盖您的值。这可以通过两种方式解决:

  1. 您可以在添加新值之前进行检查,如果该密钥已存在,请附加到现有列表。
  2. 例如:

    #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。

    1. 使用defaultdict from collections,其行为与普通dict完全相同,只是在您尝试调用尚未创建的密钥时默认值。
    2. 例如:

      #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将隐式执行。