最近想用字典来存写用户数据,主要是想解决分部分项工程存在一张字典对像里,同时又要能将字典数据写入到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的行与列大小与字典匹配就不会出错啦。