当前位置:   article > 正文

list包含某个字符串_Python新人指南[4]——字符串和列表

list包含某个字符

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

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

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

  1. list_1 = [1,2,3,4]
  2. str_1 = 'abcd'
  3. print(list_1[0])
  4. print(str_1[0])
  5. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_3.py"
  6. 1
  7. a

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

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

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

  1. list_2 = [1,2,3,4,5,6]
  2. str_2 = 'python'
  3. print(list_2[0:2])
  4. print(str_2[0:2])
  5. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_3.py"
  6. [1, 2]
  7. py

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

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

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

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

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

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

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

二、列表推导式

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

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

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

  1. list_1 = []
  2. for i in range(1,10):
  3. list_1.append(i**3)
  4. print(list_1)
  5. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_4.py"
  6. [1, 8, 27, 64, 125, 216, 343, 512, 729]

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

  1. list_2 = [i**3 for i in range(1,10)]
  2. print(list_2)
  3. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_4.py"
  4. [1, 8, 27, 64, 125, 216, 343, 512, 729]

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

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

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

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

  1. num = [1,2,3,4]
  2. list_3 = []
  3. for i in range(4):
  4. for j in range(4):
  5. for k in range(4):
  6. for l in range(4):
  7. if len(set([num[i],num[j],num[k],num[l]])) == 4:
  8. list_3.append([num[i],num[j],num[k],num[l]])
  9. print(list_3)
  10. 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]
  11. print(list_4)
  12. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_4.py"
  13. [[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,
  14. 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,
  15. 3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]
  16. [[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,
  17. 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,
  18. 3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]

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

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

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

思考题

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

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

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

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

  1. str_2 = 'abcd'
  2. l2 = list(str_2)
  3. print(l2)
  4. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
  5. ['a', 'b', 'c', 'd']

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

  1. str_1 = '1234'
  2. l1 = list(str_1)
  3. print(l1)
  4. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
  5. ['1', '2', '3', '4']

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

  1. str_1 = '1234'
  2. l1 = [int(i) for i in str_1]
  3. print(l1)
  4. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
  5. [1, 2, 3, 4]

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

  1. list_1 = [1,2,3,4]
  2. list_2 = ['a','b','c','d']
  3. s1 = str(list_1)
  4. s2 = str(list_2)
  5. print(s1)
  6. print(s2)
  7. print(list(s1))
  8. print(list(s2))
  9. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
  10. [1, 2, 3, 4]
  11. ['a', 'b', 'c', 'd']
  12. ['[', '1', ',', ' ', '2', ',', ' ', '3', ',', ' ', '4', ']']
  13. ['[', "'", 'a', "'", ',', ' ', "'", 'b', "'", ',', ' ', "'", 'c', "'", ',', ' ', "'", 'd', "'", ']']

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

  1. list_1 = [1,2,3,4]
  2. list_2 = ['a','b','c','d']
  3. s1 = ''
  4. for i in list_1:
  5. s1 += str(i)
  6. print(s1)
  7. s2 = ''
  8. for i in list_2:
  9. s2 += i
  10. print(s2)
  11. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
  12. 1234
  13. abcd

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

  1. list_2 = ['a','b','c','d']
  2. s2 = ''.join(list_2)
  3. print(s2)
  4. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzitempCodeRunnerFile.py"
  5. abcd

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

  1. list_1 = [1,2,3,4]
  2. s1 = ''.join(list_1)
  3. print(s1)
  4. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
  5. Traceback (most recent call last):
  6. File "d:python2020-zhihuquanzi0404_2.py", line 10, in <module>
  7. s1 = ''.join(list_1)
  8. TypeError: sequence item 0: expected str instance, int found

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

  1. list_1 = [1,2,3,4]
  2. list_1_s = [str(i) for i in list_1]
  3. s1 = ''.join(list_1_s)
  4. print(s1)
  5. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_2.py"
  6. 1234

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

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

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

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

  1. s = '[1, 2, 3, 4]'
  2. s = s.replace(' ','')
  3. s = s.replace(',','')
  4. s1 = s[1:-1]
  5. l1 = [int(i) for i in s1]
  6. print(l1)
  7. PS D:python2020-zhihuquanzi> python -u "d:python2020-zhihuquanzi0404_3.py"
  8. [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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/208064
推荐阅读
相关标签
  

闽ICP备14008679号