将字典数据(每一条)写入到QTableView或QTreeView每一列的算法

最近想用字典来存写用户数据,主要是想解决分部分项工程存在一张字典对像里,同时又要能将字典数据写入到QTableView的Model当中。

对比了字典与列表的存储与调用不同后,我个人觉得字典比较难以操作,所以在这两天进行了研究得到以下结论:

1、字典由于有专门的key索引,理论上应该比列表快;

2、字典操作技巧性比较高,可以转化为Pandas 的DataFrame进行操作比较合理;

3、除非有几万行数据,字典与列表一般用户,性能没有什么感觉的,其次Pandas 的DataFrame真香!

首先:字典转化为DataFrame的方法:

—>pd.DataFrame(df.values(),columns=df.keys())

然而:这种方法,只能将字典的每组数据转化为每一行数据,将数组进行stark()得到的是二维数组,郁闷~!于是就行自己研究一下算法。

于是就有了这两天的思考:将字典每一行,转化为每一列QTableView的数据算法:

原始数据df情况如下:

  • >>> df
  • {‘bridge’: [‘mt_zj_oral_talbe’, ‘mt_xl_oral_talbe’, ‘mt_dz_oral_table’], ‘road’: [‘边坡’, ‘路基’, ‘下边坡拱格’], ‘隧道’: [‘初支’, ‘仰拱’], ‘附属工程’: [‘mt_bd_oral_table’, ‘mt_lj_oral_table’, ‘mt_zd_oral_table’]}
  • >>> df.keys()
  • dict_keys([‘bridge’, ‘road’, ‘隧道’, ‘附属工程’])
  • >>> df.values()
  • dict_values([[‘mt_zj_oral_talbe’, ‘mt_xl_oral_talbe’, ‘mt_dz_oral_table’], [‘边坡’, ‘路基’, ‘下边坡拱格’], [‘初支’, ‘仰拱’], [‘mt_bd_oral_table’, ‘mt_lj_oral_table’, ‘mt_zd_oral_table’]])

写入算法:

  • x=0
  • y=0 #两个计数器x,y
  • >>> for i in df.values(): #拿出数据列
  • …     x=0 #行计数器归0
  • …     for j in i:
  • …             model.setItem(x,y,QStandardItem(j))
  • …             x+=1
  • …     y+=1 #当行写完以后,将新的一列数据换列计数+1

内容写入完成后:将表头写入

>>> model.setHorizontalHeaderLabels(df.keys())

最后,字典写入效果:

大功告成!

最后:字典的写法,有一点麻烦。不如直接操作DataFrame来得快,主要是DataFrame可以直接导入数据库,其次DataFrame数据都有自己的坐标,可以随时“切片”df.iloc[i,j]要哪个取哪个,不香吗?可以一键to_excel不香吗?可以一键to_sql不香吗?……

所以将字典转化Pandas的DataFrame上面算法已经给出了答案,只要将写入model的操作改成写入DataFrame对应方法即可—–>df.iloc[x,y]=j

只要注意先设定好df的行与列大小与字典匹配就不会出错啦。