eval() python_每日一课|Python如何将字符串类型的列表还原成列表类型

今天我在数据分析岗位需求制作词云图的时候,遇到了一个奇葩的问题具体如下:

一、问题场景:

我在制作词云图。需要将一个个的小列表,合并成一个大列表,代码如下:

fdf3970ab613d2fe14ddf55a99cb5d2e.png

正常来讲打印这个each,从肉眼来看每个数据都是列表格式

然而 what?类型都是字符串格式(这就是字符串格式的列表)

希望的效果

print(type(each))
fb647e72240c26f0e0b4766e491ce7ed.png

实际的效果:

fb5ea0c6b0e90f4d89782057fc843e14.png

想要的效果:

9774bd9039d137a3743ad954c8350fbb.png

二、解决方案:

1、evel() 它的作用就是把数据还原成它本身或者是能够转化成的数据类型。

c45b293b452dfb3aa83ab08d5e85a7eb.png

2、literal_eval() 作用同上

cb9f71c84ac875e211072cb03c8587de.png

3、str

使用时注意列表追加改成append(将一个对象追加到列表中)extend(将一组对象追加到列表中)

74961e33a32efffd5f307b6b35308bff.png

最终结果:

2ab5e8a699f9140490d8e8da8ee7e37a.png

知识点

eval和ast.literal_eval的区别

eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.下面来看看示例代码:

string <==> list

0d9228f9bd55accb5be945e17a907084.png

string <==> tuple

167efdfcae1070cd40f953e2acdb3027.png

string <==> dict

28479fd979ebf1a30da0017d64a6b661.png

也就是说,使用eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符

串型的输入直接计算。比如,她会将'1+1'的计算串直接计算出结果。

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

Python官方文档

8b3d8c3c3ba01cc2174e5f2ece7e07ab.png

简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。

比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval(),都会拒绝执行。

报值错误,不合法的字符串!

f42dfdc9cdda2773ec3389ed34ce5c17.png

而只会执行合法的Python类型,从而大大降低系统的危险性!

45321fad52d1cbef74182c7dd892d189.png

所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()函数!

希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值