python 切片、列表推导式、eval()基本操作
python 切片、列表推导式、eval的使用和实用案例
python处理数据非常便捷,可是写出python的代码必然是有python的风格,这几个常用的操作,熟悉了可以快速解决很多问题。而且让你的代码更加简洁,很python。
一、切片的操作和实用案例
切片,截取序列结构 的某一段内容。其中的序列结构当然包括了,列表,字符串,元组结构,而不只是列表。得到的序列是一个新序列,新序列类型是和截取的序列类型一致,不改变原序列。
1,2,3,4,5,6,7,8,9
1,2,3 | 4,5,6 | 7,8,9
在代码中表示为
seq[begin : end : step length]
- begin、end、step length ,表示开始,结束和截取的步长,三者皆可反向索引,简单点说,可以是负数的索引。
- begin、end 决定截取范围,step length 决定如何截取。
- 其中,begin是切片里包括的索引,end 是切片里不包括的索引,忽略步长的影响,用集合的写法就是: 切片∈ [ begin,end ) 。
切片的默认值和截取演示
begin、end、step length,三个值没有输入时,索引默认值分别是0,len(seq),1。
含义是,截取从索引0 开始到最后一个值,步长为1截取切片…也就是本身。
seq = [1,2,3,4,5,6]
print(seq[::])
#结果:[1, 2, 3, 4, 5, 6]
seq = [1,2,3,4,5,6]
print(seq[1:3:])
#结果:[2, 3]
print(seq[::2])
#结果:[1, 3, 5]
案例1:
截取字符串的内容,请提取以下ask 后面的内容。
“”"
ask:你好啊,今天是星期几?
ask:今天天气如何?
“”"
用切片:
# -*- coding: utf-8 -*-
s = """
ask:你好啊,今天是星期几?
ask:今天天气如何?
"""
for i in s.strip().split("\n"):
print(i[4::])
#strip()是去除字符串的首尾空格或回车,split("\n"),是按照回车分裂得到的s.strip().split("\n") = ["ask:你好啊,今天是星期几?","ask:今天天气如何?"]
#然后按照前缀的ask: 切除它即可,[4::]
#结果:你好啊,今天是星期几?
#今天天气如何?
案例2:
排序中的应用。升序降序皆可,已知一个有序序列,提取前几个最大值或前几个最小值的排名。不重新排序,使用切片即可。
# -*- coding: utf-8 -*-
seq = [1,2,3,4,5,6,7,8,9,10,11,12,1222,12345]#这是一个升序的序列
print(seq[::-1])#用切片得到[::-1]得到降序序列,并没有使用list.sort,或者sorted。
#获取前N个最小值,,设N = 4
N = 4
minSeq = seq[:N:]
#获取前N个最大值,,设N = 4
maxSeq = seq[-1:-(N+1):-1]#表示从最后一个开始逆向截取,一直截取到倒数第四个。
print("最小值:{}".format(minSeq))
print("最大值:{}".format(maxSeq))
由上述代码可知,切片可以快速将序列反转。
二、列表推导式
列表推导式,顾名思义是列表序列结构的,由原列表得到新列表,经过迭代的一个过程。python的列表推导式其内部是通过cpython来实现的比较用for循环要快。
列表推导式的使用
列表推导式是遍历整个原有的列表,对遍历的每个元素计算、提取、条件判断,后得到新的列表。
如求一个列表里面各个元素的平方序列。
# -*- coding: utf-8 -*-
seq = [-1,0,1,2,3,4,5,6]
#对上面的列表大于0的 元素全部求平方
#=====普通方法======
normalX2 = []
for i in seq:#循环遍历
if i>0:#判断这个元素是否符合要求
normalX2.append(i**2)#计算新的元素后添加到新的序列
#==================
seq_x2 = [i**2 for i in seq if i>0 ]#列表推导式的方法
print(seq_x2)
列表推导式可以分为三个部分。
在上述的代码中,求符合要求的元素的平方,组合为新的列表,使用列表推导式时,有三个部分,从左往右,分别是 [(基于 i 的新元素的运算)(for i in old ) (条件判断语句)],简单点就是[ 运算体,循环体,条件体]。i**2 是运算体,for i in seq 是循环体, if i>0 是条件体。
列表推导式的执行过程:
对原有的列表循环,判断某个元素是否符合条件,符合则执行运算体,不符合跳过。
列表推导式的案例应用:
- 整体提取复杂结构的某个索引
seq = [["a",1],["b",2],["c",3],["d",4]]
seq_0 = [i[0] for i in seq]
print(seq_0)
#结果:['a', 'b', 'c', 'd']
- 单纯计算
seq = [-1,0,1,2,3,4,5,6]
seq_x2 = [i**2 for i in seq]
print(seq_x2)
#结果:[1, 0, 1, 4, 9, 16, 25, 36]
- 单纯判断
seq = [-1,0,1,2,3,4,5,6]
seq_new= [i for i in seq if i>0 ]#列表推导式的方法
print(seq_new)
#结果:[1,2,3,4,5,6]
- 函数运算
这里的运算体是一个函数调用,因此
# -*- coding: utf-8 -*-
seq = [-1,0,1,2,3,4,5,6]
strSeq = [str(i) for i in seq]
print(strSeq)
#结果:['-1', '0', '1', '2', '3', '4', '5', '6']
三、 eval(str)
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
因此eval相当于python先去执行了这个字符串的内容,得到的结果。
执行代码:
# -*- coding: utf-8 -*-
s = eval("1 is 1")
print(s)
#True
案例1
得到字符串里的结构
# -*- coding: utf-8 -*-
s = eval("[1,2,3]")
print(s)
print(type(s))
#结果:[1, 2, 3]
#<class 'list'>
在上面的代码中,其实经常有一种应用,在保存文件的时候,如保存一堆处理好的列表的数据,我们用以下代码写入的txt 是一个字符串:
# -*- coding: utf-8 -*-
seq = [-1,0,1,2,3,4,5,6]
f = open("h.txt","w",encoding="utf8")
f.writelines(str(seq))
f.close()
当你读取的这个列表的时候,会有:
f = open("h.txt","r",encoding="utf8")
seq = f.read()
f.close()
print(type(seq))#<class 'str'>是字符串类型
eval_seq = eval(seq)#调用eval()
print(type(eval_seq))#<class 'list'> 是列表类型
案例2
输入的数字不清楚是int 或者 float的时候:
如由input输入两个数a,b进行运算。
你输入的类型很可能是int或者float型,
很多初学者犯这样的错误!
由于input()输入的数值都是字符串,计算时使用的是数值类型。
喜欢来一个a = int(input(“input a >”)),在你输入一个1.2之后呢显然会改变输入的数值,但是你又不知道你将输入的数值是什么类型,何必要强制转换类型呢?使用eval()即可!
包括复数类型…
a = eval(input("输入a>"))
b = eval(input("输入b>"))
print(a+b)
输入a>100.1
输入b>100
200.1
在不转换类型的前提下甚至可以计算复数:
输入a>1+10j
输入b>1.9
(2.9+10j)
除此之外,eval 可以执行python语句,可以有很多巧妙的应用。来解决对字符串的数据处理问题。
总结:
哪里不懂看哪里,有这些思维去写python 一定会更简洁,更轻松。
本文地址:https://blog.csdn.net/weixin_44119512/article/details/106738854