今天我在数据分析岗位需求制作词云图的时候,遇到了一个奇葩的问题具体如下:
一、问题场景:
我在制作词云图。需要将一个个的小列表,合并成一个大列表,代码如下:
![fdf3970ab613d2fe14ddf55a99cb5d2e.png](https://img-blog.csdnimg.cn/img_convert/fdf3970ab613d2fe14ddf55a99cb5d2e.png)
正常来讲打印这个each,从肉眼来看每个数据都是列表格式
然而 what?类型都是字符串格式(这就是字符串格式的列表)
希望的效果
print(type(each))
![fb647e72240c26f0e0b4766e491ce7ed.png](https://img-blog.csdnimg.cn/img_convert/fb647e72240c26f0e0b4766e491ce7ed.png)
实际的效果:
![fb5ea0c6b0e90f4d89782057fc843e14.png](https://img-blog.csdnimg.cn/img_convert/fb5ea0c6b0e90f4d89782057fc843e14.png)
想要的效果:
![9774bd9039d137a3743ad954c8350fbb.png](https://img-blog.csdnimg.cn/img_convert/9774bd9039d137a3743ad954c8350fbb.png)
二、解决方案:
1、evel() 它的作用就是把数据还原成它本身或者是能够转化成的数据类型。
![c45b293b452dfb3aa83ab08d5e85a7eb.png](https://img-blog.csdnimg.cn/img_convert/c45b293b452dfb3aa83ab08d5e85a7eb.png)
2、literal_eval() 作用同上
![cb9f71c84ac875e211072cb03c8587de.png](https://img-blog.csdnimg.cn/img_convert/cb9f71c84ac875e211072cb03c8587de.png)
3、str
使用时注意列表追加改成append(将一个对象追加到列表中)extend(将一组对象追加到列表中)
![74961e33a32efffd5f307b6b35308bff.png](https://img-blog.csdnimg.cn/img_convert/74961e33a32efffd5f307b6b35308bff.png)
最终结果:
![2ab5e8a699f9140490d8e8da8ee7e37a.png](https://img-blog.csdnimg.cn/img_convert/2ab5e8a699f9140490d8e8da8ee7e37a.png)
知识点
eval和ast.literal_eval的区别
eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.下面来看看示例代码:
string <==> list
![0d9228f9bd55accb5be945e17a907084.png](https://img-blog.csdnimg.cn/img_convert/0d9228f9bd55accb5be945e17a907084.png)
string <==> tuple
![167efdfcae1070cd40f953e2acdb3027.png](https://img-blog.csdnimg.cn/img_convert/167efdfcae1070cd40f953e2acdb3027.png)
string <==> dict
![28479fd979ebf1a30da0017d64a6b661.png](https://img-blog.csdnimg.cn/img_convert/28479fd979ebf1a30da0017d64a6b661.png)
也就是说,使用eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符
串型的输入直接计算。比如,她会将'1+1'的计算串直接计算出结果。
![959656062e06b32e72925bd171d66bc0.png](https://img-blog.csdnimg.cn/img_convert/959656062e06b32e72925bd171d66bc0.png)
从上面来看,eval功能可谓非常强大,即可以做string与list,tuple,dict之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说eval强大的背后,是巨大的安全隐患!!! 比如说,用户恶意输入下面的字符串
open(r'D://filename.txt', 'r').read()
__import__('os').system('dir')
__import__('os').system('rm -rf /etc/*')
那么eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作,她也会照做不误!!!
所以这里就引出了另外一个安全处理方式ast.literal_eval.可以先看下stackoverflow及Python官方关于这个解释!
stackoverflow
![8beb806a0799220573adb90da53d6781.png](https://img-blog.csdnimg.cn/img_convert/8beb806a0799220573adb90da53d6781.png)
Python官方文档
![8b3d8c3c3ba01cc2174e5f2ece7e07ab.png](https://img-blog.csdnimg.cn/img_convert/8b3d8c3c3ba01cc2174e5f2ece7e07ab.png)
简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval(),都会拒绝执行。
报值错误,不合法的字符串!
![f42dfdc9cdda2773ec3389ed34ce5c17.png](https://img-blog.csdnimg.cn/img_convert/f42dfdc9cdda2773ec3389ed34ce5c17.png)
而只会执行合法的Python类型,从而大大降低系统的危险性!
![45321fad52d1cbef74182c7dd892d189.png](https://img-blog.csdnimg.cn/img_convert/45321fad52d1cbef74182c7dd892d189.png)
所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()函数!
希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油