赞
踩
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
第一行数标注了字符串非负的索引的位置,第二行标注了对应的负的索引。那么从 i到 j的切片就包括了标有 i和 j的位置之间的所有字符。
下面我们来展示一些常见也很实用的切片写法:
- 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
子句,然后是零个或多个for
或if
子句。 其结果将是一个新列表,由对表达式依据后面的for
和if
子句的内容进行求值计算而得出。
我们这次举一个稍复杂一些的例子:
创建一个列表,列表内的元素是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]'
我们研究下字符串和列表相互转换有几种情况:
第二种情况还是比较简单的,我们直接使用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.comPython官方文档字符串列表介绍,数据结构详细介绍
3. Python 的非正式介绍 - Python 3.8.2 文档docs.python.org 5. 数据结构 - Python 3.8.2 文档docs.python.orgCopyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。