py遍历字符串的每个字符_Python新人指南[4]——字符串和列表

这篇博客介绍了Python中字符串和列表的基本操作,包括索引、切片以及列表推导式。讲解了如何通过索引和切片访问元素,以及如何实现字符串和列表的互相转换。此外,还详细阐述了列表推导式的使用,通过实例展示了其简洁高效的特性。最后,给出了字符串转数字列表的解决方法,并提出了一个组合数字的排列问题作为思考题。
摘要由CSDN通过智能技术生成

02068c7aac93f53de64317664909aa66.png
Python新人指南[0]
Python新人指南[1]
Python新人指南[2]
Python新人指南[3]
Python新人指南[4]——字符串和列表
用Python解数独系列

本篇内容挑几个例子给大家讲一讲字符串和列表的基础知识,看你掌握了多少。

一、字符串、列表的索引和切片

list_1 = [1,2,3,4]
str_1 = 'abcd'

print(list_1[0])
print(str_1[0])

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_3.py"
1
a

字符串和列表都可以通过索引访问字符串中的某个字符,列表中的某个元素。(或者叫下标访问),Python计数是从0开始,如上面的代码所示:list_1[0], str_1[0]。

索引值可以是0和正整数,如果字符串或者列表的长度为n,则“0 <= 索引值 <= n-1”;

与此同时索引值也可以是负整数,表示从右往左数的字符或者元素,比如list_1[-1]是指list_1这个列表从右往左数第1个元素。如果索引值为负整数,范围:“-n <= 索引值 <= -1”

list_2 = [1,2,3,4,5,6]
str_2 = 'python'

print(list_2[0:2])
print(str_2[0:2])

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_3.py"
[1, 2]
py

了解了索引访问,就可以讲切片了,如上面的代码,我们可以用在字符串名或者列表名后面加上诸如“[x:y]”,来获取字符串的子串,或者列表的子序列。

切片这个词很形象,那么是从哪里开始切,切到哪里呢?我们可以直观地把切片的两个数值理解为一个左闭右开区间,以str_2[0:2]为例,它包含了str_2[0],但不包含str_2[2]。我们还可以借用官方文档的一个例子理解切片:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1
第一行数标注了字符串非负的索引的位置,第二行标注了对应的负的索引。那么从 ij的切片就包括了标有 ij的位置之间的所有字符。

下面我们来展示一些常见也很实用的切片写法:

list_2 = [1,2,3,4,5,6]

print(list_2[-4:5])     # 切片也可以包含负索引值
print(list_2[:3])       # 如果省略开始的切片索引值,则默认为0
print(list_2[3:])       # 如果省略结束的切片索引值,则默认到字符串或者列表的结束,即为len(list_2)
print(list_2[:])        # 如果开始和结束的切片索引值都省略,则表示该字符串或者列表的一个浅拷贝
print(list_2[0:5:2])    # 实际上切片可以添加第三个参数——步长,2表示长度为2,会跳过1个元素
print(list_2[0:6:-1])   # 如果步长为负,则会从反方向选取元素
print(list_2[::-1])     # 了解了步长这个参数,那么当开始和结束切片索引值省略时,步长为-1,则会返回整个列表的逆序列表或者字符串的逆序字符串

对于列表,list_2[::-1],效果和reverse()方法类似,区别在于前者创建了一个新的列表,后者是把原列表逆序,没有返回值。

而对于字符串,因为字符串immutable类型,也就是说字符串的值是不能修改的,想用类似 str_1[0] = 's' 的方式修改字符串str_1的值,是不可以的。也因为这样,字符串是没有reverse()方法的,因此用str_1[::-1]获得一个原字符串的逆序字符串,就是一个比较简单高效的方法。

二、列表推导式

列表推导式是一个Python的语法糖,即简洁高效的语法特性,可以用简短的代码创建一个列表,而无需用冗长的代码表示列表的生成规则。

列表推导式,我觉得初学者越早了解、掌握,越好。因为在学习过程中,我们经常需要去学习、研究前人的代码,而“大牛”们经常会使用列表推导式。

举个例子先,比如我们现在要创建一个1到9立方的列表,用常用手段就是:

list_1 = []
for i in range(1,10):
    list_1.append(i**3)
print(list_1)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_4.py"
[1, 8, 27, 64, 125, 216, 343, 512, 729]

不算print,我们用了3行代码,如果用列表推导式,一行代码就够了:

list_2 = [i**3 for i in range(1,10)]
print(list_2)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_4.py"
[1, 8, 27, 64, 125, 216, 343, 512, 729]

根据官方文档的定义,列表推导式是

列表推导式的结构是由一对方括号所包含的以下内容:一个表达式,后面跟一个 for子句,然后是零个或多个 forif子句。 其结果将是一个新列表,由对表达式依据后面的 forif子句的内容进行求值计算而得出。

我们这次举一个稍复杂一些的例子:

创建一个列表,列表内的元素是1,2,3,4四个数字的每一种排列

num = [1,2,3,4]
list_3 = []
for i in range(4):
    for j in range(4):
        for k in range(4):
            for l in range(4):
                if len(set([num[i],num[j],num[k],num[l]])) == 4:
                    list_3.append([num[i],num[j],num[k],num[l]])
print(list_3)

list_4 = [[num[i],num[j],num[k],num[l]] for i in range(4) for j in range(4) for k in range(4) for l in range(4) if len(set([num[i],num[j],num[k],num[l]])) == 4]
print(list_4)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_4.py"
[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2], [2, 1, 3, 4], [2, 1, 4, 3], [2, 3, 1, 4], [2, 3, 4, 
1], [2, 4, 1, 3], [2, 4, 3, 1], [3, 1, 2, 4], [3, 1, 4, 2], [3, 2, 1, 4], [3, 2, 4, 1], [3, 4, 1, 2], [3, 4, 2, 1], [4, 1, 2, 3], [4, 1, 
3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]
[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2], [2, 1, 3, 4], [2, 1, 4, 3], [2, 3, 1, 4], [2, 3, 4, 
1], [2, 4, 1, 3], [2, 4, 3, 1], [3, 1, 2, 4], [3, 1, 4, 2], [3, 2, 1, 4], [3, 2, 4, 1], [3, 4, 1, 2], [3, 4, 2, 1], [4, 1, 2, 3], [4, 1, 
3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]

需要注意的是,列表推导式里for语句和if语句的顺序和普通写法for语句和if语句的顺序是一致的!

两种写法其内部逻辑是一样的,列表推导式的写法看起来更“高级”!学会使用列表推导式,可以让你的代码看起来更简洁、高级!

三、字符串和列表互相转换

思考题

# 如何把下面这个字符串转换为数字列表[1,2,3,4]
s = '[1, 2, 3, 4]'

我们研究下字符串和列表相互转换有几种情况:

  1. 字符串转换为数字列表
  2. 字符串转换为字符串列表
  3. 数字列表转换为字符串
  4. 字符串列表转换为字符串

第二种情况还是比较简单的,我们直接使用list()方法,输出的结果符合预期

str_2 = 'abcd'
l2 = list(str_2)
print(l2)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
['a', 'b', 'c', 'd']

第一种情况,直接用list()方法得到的,实际是一个字符串列表,还需要再想办法

str_1 = '1234'
l1 = list(str_1)
print(l1)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
['1', '2', '3', '4']

我们可以直接使用列表推导式

str_1 = '1234'
l1 = [int(i) for i in str_1]
print(l1)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
[1, 2, 3, 4]

列表转换为字符串,是不是直接使用str()方法就可以了呢?貌似不行,直接使用str方法,很耿直的把 '[' 和 ',' 甚至是空格 ' ' 和单引号 ''' 都放到字符串里面了。

list_1 = [1,2,3,4]
list_2 = ['a','b','c','d']

s1 = str(list_1)
s2 = str(list_2)
print(s1)
print(s2)
print(list(s1))
print(list(s2))

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
[1, 2, 3, 4]
['a', 'b', 'c', 'd']
['[', '1', ',', ' ', '2', ',', ' ', '3', ',', ' ', '4', ']']
['[', "'", 'a', "'", ',', ' ', "'", 'b', "'", ',', ' ', "'", 'c', "'", ',', ' ', "'", 'd', "'", ']']

此时需要创建一个空字符串,然后遍历列表,将列表每个元素添加到这个字符串里面就好了。而对于数字列表,需要额外处理一步,即用str()方法把数字转换为字符串。

list_1 = [1,2,3,4]
list_2 = ['a','b','c','d']

s1 = ''
for i in list_1:
    s1 += str(i)
print(s1)   

s2 = ''
for i in list_2:
    s2 += i
print(s2)  

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
1234
abcd

是不是感觉有点麻烦?对于字符串列表,我们可以使用join()方法,轻松转化为字符串

list_2 = ['a','b','c','d']

s2 = ''.join(list_2)
print(s2)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzitempCodeRunnerFile.py"
abcd

需要注意join()方法只能传入字符串列表,直接传入数字列表会报错

list_1 = [1,2,3,4]

s1 = ''.join(list_1)
print(s1)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
Traceback (most recent call last):
  File "d:python2020-zhihuquanzi0404_2.py", line 10, in <module>
    s1 = ''.join(list_1)
TypeError: sequence item 0: expected str instance, int found

我们可以考虑用列表推导式先把数字列表转换为字符串列表,再用join()方法转换为字符串

list_1 = [1,2,3,4]

list_1_s = [str(i) for i in list_1]
s1 = ''.join(list_1_s)
print(s1)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
1234

那么我们现在看一看这个开胃菜

# 如何把下面这个字符串转换为数字列表
s = '[1, 2, 3, 4]'

首先用切片“掐头去尾”,就可以去掉 '[' 和 ']' 了,然后呢?

split()方法处理,是不OK的。split()方法只能根据一种分隔符把字符串转换为字符串列表,而这个字符串里又有逗号又有空格。这种情况,我们可以考虑用replace()方法,把逗号和空格都替换为空字符串(''),这样我们就得到了一个字符串'1234',再用之前的方法转换为列表即可。

s = '[1, 2, 3, 4]'

s = s.replace(' ','')
s = s.replace(',','')
s1 = s[1:-1]
l1 = [int(i) for i in s1]
print(l1)

PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_3.py"
[1, 2, 3, 4]

四、最后一个思考题

从1,2,3,4中任取1到4个数字(数字不可重复)组成一个排列,将所有可能的排列枚举出来放到一个列表中,用列表推导式表达。

五、拓展学习资料

菜鸟编程字符串、列表

Python3 字符串 | 菜鸟教程​www.runoob.com Python3 列表 | 菜鸟教程​www.runoob.com

Python官方文档字符串列表介绍,数据结构详细介绍

3. Python 的非正式介绍 - Python 3.8.2 文档​docs.python.org 5. 数据结构 - Python 3.8.2 文档​docs.python.org
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值