美文网首页
[Python]创建字典列表dictlist每行都一样的问题

[Python]创建字典列表dictlist每行都一样的问题

作者: 神农架村姑 | 来源:发表于2019-08-22 09:25 被阅读0次

    从网上读取一个表格,想创建一个由字典组成的列表,字典key为列名。

    错误写法

    row_dict={}
    dictlist=[]
    ...
    for tr in first_table.find_all('tr'):
      tds = tr.find_all('td')
      n=0
      for td in tds:
        row_dict[colums[n]]= td.string
        n=n+1
      dictlist.append(row_dict)
    print(dictlist)
    

    结果

    [{'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
     {'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'}, 
     {'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'}, 
     {'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
     {'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'},
     {'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'}]
    

    不管循环多少遍,只存储了最后一个字典,还把之前的都更新了。
    在append之前打印row_dict地址试一下:

    print(id(row_dict))
    1860277256696
    1860277256696
    1860277256696
    1860277256696
    1860277256696
    1860277256696
    

    说明
    每次添加的都是同一个内存地址到list中,row_dict每次写入的时候,改变了内存中的value,但是地址不变。即 只创建了一次内存空间,只会不断的改变value,添加到list中的时候value已经改了。
    所以需要在for循环里面,每次循环append都创建一个空的dict,以保证之前添加过的不会被改变;或者复制row_dict到新的地址,再append。

    正确写法一

    dictlist.append(row_dict.copy())
    
    print(id(row_dict.copy()))
    1860286664496
    1860277198280
    1860277197776
    1860286681736
    1860286681448
    1860277197848
    

    正确写法二

    dictlist=[]
    ...
    for tr in first_table.find_all('tr'):
      tds = tr.find_all('td')
      row_dict={}
      n=0
      for td in tds:
        row_dict[colums[n]]= td.string
        n=n+1
      dictlist.append(row_dict)
    print(dictlist)
    

    结果

    [{'Fuel': 'E10', 'Price': '124.3', 'Name': '11-Seven Hallam', 'Suburb': 'Hallam', 'State': 'VIC', 'Postcode': '3803'},
     {'Fuel': 'U91', 'Price': '125.3', 'Name': '11-Seven Southern River', 'Suburb': 'Southern River', 'State': 'WA', 'Postcode': '6110'},
     {'Fuel': 'U95', 'Price': '137.3', 'Name': '11-Seven Southern River', 'Suburb': 'Southern River', 'State': 'WA', 'Postcode': '6110'},
     {'Fuel': 'U98', 'Price': '127.7', 'Name': '11-Seven Waverley Gardens', 'Suburb': 'Mulgrave', 'State': 'VIC', 'Postcode': '3170'},
     {'Fuel': 'Diesel', 'Price': '138.9', 'Name': '11-Seven Minto', 'Suburb': 'Minto', 'State': 'NSW', 'Postcode': '2566'},
     {'Fuel': 'LPG', 'Price': '59.7', 'Name': '11-Seven Fairfield East', 'Suburb': 'Fairfield', 'State': 'VIC', 'Postcode': '3078'}]
    

    相关文章

      网友评论

          本文标题:[Python]创建字典列表dictlist每行都一样的问题

          本文链接:https://www.haomeiwen.com/subject/qcjgsctx.html