欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python 切片、列表推导式、eval()基本操作

程序员文章站 2022-09-06 13:00:09
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)

列表推导式可以分为三个部分。
python 切片、列表推导式、eval()基本操作
在上述的代码中,求符合要求的元素的平方,组合为新的列表,使用列表推导式时,有三个部分,从左往右,分别是 [(基于 i 的新元素的运算)(for i in old ) (条件判断语句)],简单点就是[ 运算体,循环体,条件体]。i**2 是运算体,for i in seq 是循环体, if i>0 是条件体。
列表推导式的执行过程:
对原有的列表循环,判断某个元素是否符合条件,符合则执行运算体,不符合跳过。

列表推导式的案例应用:

  1. 整体提取复杂结构的某个索引
seq = [["a",1],["b",2],["c",3],["d",4]]
seq_0 = [i[0] for i in seq]
print(seq_0)
#结果:['a', 'b', 'c', 'd']
  1. 单纯计算
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]
  1. 单纯判断
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]
  1. 函数运算
    这里的运算体是一个函数调用,因此
# -*- 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