Python字符串和序列总结

部分内容整理来自《零基础入门学习Python》–小甲鱼 编著

一、字符串的索引和切片

  • 索引:从0开始,-1表示倒数第一个
 s = "ABCDEFGH"
 s1 = s[0]   # 取第一个
 s2 = s[2]   # 取第三个
 s3 = s[-1]  # 取倒数第一个
 s4 = s[-2]  # 取倒数第二个
 
 print(s1, s2, s3, s4)
 A C H G
  • 切片 :顾头不顾尾
  • 用切片复制字符串s[:],原字符串不会收到影响
 s = "ABCDEFGH"
 s5 = s[0:4]   #取前面四个
 s6 = s[0:-1]  #取第一个到倒数第二个
 print(s5, s6)
 
 ABCD ABCDEFG

 s7 = s[:]  #复制一个字符串
 s8 = s[0:]  #取第一个到最后一个
 print(s7, s8)
 
 >>> s9 = s[0:0]
 >>> s9
 ''
 ABCDEFGH ABCDEFGH
  • #s[首:尾:步长]
  s = "ABCDEFGH"
 s10 = s[0:5:2]    #以2的步长从前5个取数
 s11 = s[4:0:-1]   #从右往左边取,取第5位到第2位(顾头不顾尾)
 s12 = s[3::-1]    #从右往左边取,取第4位到最开始
 s13 = s[3::-2]    #从右往左边取,以2的步长取第4位到最开始
 s14 = s[-1::-1]   #从右往左边取,取最后一个到最开始
 s15 = s[::-1]     #复制一个倒排的字符串
 print(s10, s11, s12, s13, s14, s15)

ACE EDCB DCBA DB HGFEDCBA HGFEDCBA
  • 字符串和元祖一样,一旦定下来就不能直接修改,强行修改可以委屈求全法…
>>> s = "ABCDEFGH"
>>> s1 = s[:4] + "我是被插入的字符串" + s[4:]
>>> s1
'ABCD我是被插入的字符串EFGH'

二、字符串的各种内置方法

方法含义
capitalize( )把字符串的第一个字符改为大写
casefold()把整个字符串的所有字符改成小写
count(sub[, start[, end]])返回sub在字符串里边出现的次数,start和end参数表示范围,可选
endswith(sub[, start[, end]])检查字符串是否以sub字符串结束,如果是返回True,否则返回False。
expandtabs([tabsize= 8])把字符串中的Tab符号(\t)转换为空格,如不指定参数,默认空格数是 8
find(sub[, start[, end]])检测sub是否包含在字符串内,如果有则返回索引值,否则返回-1
index(sub[, start[, end]])跟find方法一样,不过当sub不在字符串中会产生一个异常
isdigit()如果字符串中只包含数字则返回True,否则返回False
islower()如果字符串中至少包含一个区分大小写的字符,并且这些字符都是小写,则返回True,否则返回False
join(sub)以字符串作为分隔符,插入到sub中所有字符之间
split([sep=None, maxsplit=-1])不带参数默认是以空格为分隔符切片字符串,如果maxsplit有设值,则仅分隔maxsplit个子字符串,返回切片后的子字符串拼接的列表
strip([chars])删除字符串前边和后边所有的空格,chars参数可以定制删除的字符,可选。返回一个新的字符串,原字符串没变
replace(old,new[, count])把字符串中的old子字符串替换成new子字符串,如果count指定,则替换不超过count次

join()可以用来高效地连接字符串(相比于+),返回一个字符串;split()刚好相反,split()用来拆分字符串,返回一个列表。replace()用于替换字符串中的字字符串。

>>> 'x'.join("Python")
'Pxyxtxhxoxn'
>>> '_'.join("Python")
'P_y_t_h_o_n'


# join()效率高于 +
>>> 'I' + ' ' +  'am' + ' ' + 'studying' + ' ' +  'Python'
'I am studying Python'
>>> ' '.join(['I', 'am','studying','Python'])
'I am studying Python'


>>> str1 = "I love you"
>>> str1.replace("you", "jacky")
'I love jacky'
>>> str1 = ' '.join(["I", "love", "jaky"])
>>> str1
'I love jaky'

>>> str1.split()
['I', 'love', 'jaky']
>>> str2 = '_'.join("jacky")
>>> str2
'j_a_c_k_y'
>>> str2.split(sep= '_')
['j', 'a', 'c', 'k', 'y']

三、格式化

  • format()
    format()方法接受位置参数和关键字参数,二者均传递到一个叫做replacement()字段。而这个replacement字段在字符串内由大括号({})表示。
>>> "{0} love {1}.{2}".format("I", "Jacky", "com")    #位置参数
'I love Jacky.com'
>>> "{a} love {b}.{c}".format(a= "I", b= "Jacky", c= "com")   #关键字参数
'I love Jacky.com'

# 使用混合参数时,位置参数必须在关键字参数之前,否则将会报错
>>> "{0} love {b}.{c}".format("I", b= "Jacky", c= "com")  
'I love Jacky.com'
>>> "{a} love {b}.{0}".format(a= "I", b= "Jacky","com")
SyntaxError: positional argument follows keyword argument

把大括号打印出来可以使用{{}},位置参数“不打印”没有输出,是因为{0}的特殊功能被大括号({})剥夺,没有字段可以输出,但这并不会产生错误。
可以看到,位置参数{1}后面多了一个冒号。在替换域中,冒号表示格式化的开始,".2"的意思是四舍五入到保留两位小数点,而f的意思是浮点数,所以按照格式化符号的要求打印了3.14.

>>> "{{0}}".format("不打印")
'{0}'
>>> "{0}:{1:.2f}".format("圆周率",3.1415923653)
'圆周率:3.14'

四、格式化操作符 %
             Python格式化操作符号及含义

符号含义
%c格式化字符及其ASCII码
%s格式化字符串
%d格式化整数
%f格式化浮点数字,可指定小数点后的精度
%o格式化无符号整数
%x格式化无符号十六进制数
%X格式化无符号十六进制数(大写)
%e用科学计数法格式化浮点数
%E作用同%e,用科学计数法格式化浮点数
%g根据值的大小决定使用%f或%e
%G作用同%g,根据值的大小决定使用%f或%E

下面举一些例子

>>> '%c'% 97
'a'
>>> '%d转换为八进制是:%o' %   (123, 123)
'123转换为八进制是:173'
>>> '%f用科学计数法表示为:%e' % (15131400,15131400)
'15131400.000000用科学计数法表示为:1.513140e+07'

Python格式化操作符的辅助命令

符号含义
m.nm是显示的最小总宽度,n是小数点后的位数
-结果左对齐
+在正数前面显示加号(+)
#在八进制数前面显示‘0O’,在十六进制数前面显示‘0x64’或‘0X64’
0显示的数字前面填充‘0’代替空格

给大家举一些小栗子

>>> '%5.2f' % 3.1415923535  #字符宽度最小为5,取两位小数
' 3.14'
>>> '%.2e' % 27.568  #以科学计数法,小数点后两位小数表示
'2.76e+01'

>>> '%10d' % 5  
'         5'
>>> '% -10d' % 5   #最小宽度为10,结果左对齐
' 5        '
>>> '%#X'%100   #100的八进制数,在八进制数前面显示‘0X’
'0X64'

Python的转义字符及含义

符号说明符号说明
\’单引号\r回车符
\"双引号\f换页符
\a发出系统响铃声\o八进制数代表的字符
\b退格符\x十六进制数代表的字符
\n换行符\0表示一个空字符
\t横向制表符(TAB)\\反斜杠
\v纵向制表符

四、序列           
列表、元祖、字符串放在一起是有道理的,因为他们有很多共同的特点:

  • 都可以通过索引得到每一个元素
  • 默认索引都是从0开始(当然Python还支持负数索引)
  • 可以通过分片的方法得到一个范围内的元素的集合
  • 有很多共同的操作符(重读操作符、拼接操作符、成员操作符)

我们把他们统称为:序列!下面介绍一些关于序列常用的BIF(内建方法)

  • list([literable]) 把一个可迭代的对象转换为列表
  • tuple([iterable]) 把一个可迭代的对象转换为元祖
  • str(obj) 把obj对象转换为字符串
 # 创建一个空列表
>>> a = list()
>>> a
[]

#把字符串中的每个字符迭代存放到列表中
>>> b = list("jacky")
>>> b
['j', 'a', 'c', 'k', 'y']
>>> c = list((1, 1, 2, 3, 8, 13))
>>> c
[1, 1, 2, 3, 8, 13]
#tuple()的用法和list()一样
  • len(sub) 返回sub参数的长度
  • max(···) 返回序列或者参数集合中的最大值,也就是说,max()的参数可以是一个序列,返回值是该序列中的最大值;亦可是多个参数,那么max()将返回这些参数中最大的一个
  • min(···) 和max()用法一样,效果相反;使用max()和min()方法都要保序列或参数的数据类型呢统一,否则会出错。
>>> str1 = "I am studying Python!"
>>> len(str1)
21
>>> list1 = [1, 2, 3, 5, 6]
>>> len(list1)
5
>>> tuple1 = "我是", "一个", "元祖"
>>> len(tuple1)
3
>>> list1 = [1, 18, 0, -5]
>>> max(list1)
18
>>> str1 = "I am studying Python"
>>> max(str1)
'y'
>>> max(5, 2, 2, 3, 45, -5)
45

>>> list1 = [1, 2, 3, 5, 6]   #列表中数据类型不一致,使用max(),min()会抛出类型错误
>>> list1.append("毒瘤")
>>> max(list1)
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    max(list1)
TypeError: '>' not supported between instances of 'str' and 'int'
>>> 
 #猜想max(tuple1)的实现方法
 
temp = tuple1[0]

 for each in tuple1:
	if each > temp:
		temp = each
    return temp
  • 迭代:所谓迭代,是重复反馈过程的活动,其目的通常是为了接近并达到所需的目标或结果。每一次过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
  • sum(iterable[, start])方法用于返回序列iterable的总和,用法和max()和min()一样。但sum()方法有一个可选参数(start),如果设置该参数,表示从该值开始加起,默认是0
  • sorted(iterable, key= None, reverse= False) 方法用于返回一个排序的列表,和内建方法sort()效果一致,但sort()方法是实现列表的原地排序;而sorted()方法是返回一个排序后的新列表。
  • reversed(sequence)方法用于返回逆向迭代序列的值。同样的道理,实现的效果和内建方法reverse()一样。区别是列表的内建方法是原地翻转,而reversed()是返回一个翻转后的迭代器对象。你没看错,他不是返回一个列表,是返回一个迭代器对象。
>>> tuple1 = 1, 2, 3, 4, 5
>>> sum(tuple1)
15
>>> sum(tuple1, 10)    #从10开始加
25
>>> list1 = [1, 18, 13, 0, -5]
>>> list2 = list1[:]
>>> list1
[1, 18, 13, 0, -5]
>>> sorted(list2)
[-5, 0, 1, 13, 18]
>>> list2         #原来的列表没有发生变化
[1, 18, 13, 0, -5]

>>> list1 = [1, 18, 13, 0, -5]
>>> reversed(list1)
<list_reverseiterator object at 0x000001234CA980B8>
>>> for each in reversed(list1):
	print(each, end=',')

-5,0,13,18,1,
  • enumerate(iterable)方法生成由二元组(二元组就是元素数量为2的元祖)构成的一个迭代对象,每一个二元组是由可迭代对象的索引号及其对应的元素组成的。enumerate参数是一个迭代器对象,比如可以是列表,字符串等,输出索引值和对应的元素值。指定第二个参数可以以指定序号开始,举个栗子:
>>> str1 = "Jacky"
>>> for each in enumerate(str1):
	print(each)

(0, 'J')
(1, 'a')
(2, 'c')
(3, 'k')
(4, 'y')
#以下两种方法实现的功能一样
li = ['jacky', 'jiacheng', 'jiexin', 'haha']
for i in li:
    print(li.index(i)+1, i)

for index, i in enumerate(li, 1):   #指定序号从1开始
    print(index, i)
    
1 jacky
2 jiacheng
3 jiexin
4 haha
1 jacky
2 jiacheng
3 jiexin
4 haha
  • zip(iter1[, iter2[···]])方法返回由各个可迭代对象共同组成的元祖,举个栗子:
>>> list1  = [1, 3, 5, 7, 9]
>>> str1 = "Jacky"
>>> for each in zip(list1, str1):
	print(each)

(1, 'J')
(3, 'a')
(5, 'c')
(7, 'k')
(9, 'y')

>>> tuple1 = (2, 4, 6, 8, 10)
>>> for each in zip(list1, str1, tuple1):
	print(each)

(1, 'J', 2)
(3, 'a', 4)
(5, 'c', 6)
(7, 'k', 8)
(9, 'y', 10)
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 字符串求子序列可以通过递归方法来实现。具体做法如下: 首先,编写一个函数 `find_subsequence(s, subsequence)`,其 `s` 表示原始字符串,`subsequence` 表示当前找到的子序列。函数的作用是找到字符串 `s` 的所有长度大于等于1的子序列。 在函数内部,分别考虑两种情况:当前字符 `s[0]` 参与子序列和不参与子序列。 1. 如果当前字符 `s[0]` 参与子序列,将其加入到 `subsequence` ,并递归调用 `find_subsequence(s[1:], subsequence + s[0])`,即在剩余的字符串寻找子序列。 2. 如果当前字符 `s[0]` 不参与子序列,直接递归调用 `find_subsequence(s[1:], subsequence)`,即在剩余的字符串寻找子序列。 需要注意的是,递归调用 `find_subsequence` 时,需要传递更新后的 `s` 和 `subsequence`。 在递归的过程,需要判断以下结束条件: 1. 当字符串 `s` 的长度为0时,表示已经遍历完了原始字符串,将 `subsequence` 加入到结果列表。 2. 当字符串 `s` 的长度为1时,表示只剩下一个字符了,此时需要将当前字符加入到 `subsequence` ,并将 `subsequence` 加入到结果列表。 最后,在主程序调用 `find_subsequence` 函数,并打印结果列表即可完成字符串求子序列的操作。 需要注意的是,这种方法可能会产生大量的重复子序列,因此可以使用集合(set)来存储结果,避免重复。另外,也可以对结果进行排序,使得结果按照一定的顺序输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值