Python-04:数据结构
1. 字符串切片
从本质上讲,字符串是由多个字符构成的,字符之间是有顺序的,这个顺序号称为索引(index)。
- 获取单个字符
在方括号 [ ] 中使用索引即可访问对应的字符,具体的语法格式为:
1 | strname[index] |
Python 允许从字符串的两端使用索引:
- 当以字符串的左端(字符串的开头)为起点时,索引是从 0 开始计数的;字符串的第一个字符的索引为 0,第二个字符的索引为 1,第三个字符串的索引为 2 ……
- 当以字符串的右端(字符串的末尾)为起点时,索引是从 -1 开始计数的的;字符串的倒数第一个字符的索引为 -1,倒数第二个字符的索引为 -2,倒数第三个字符的索引为 -3 ……
- 获取多个字符(字符串截去 / 字符串切片)
使用门除了可以获取单个字符外,还可以指定一个范围来获取多个字符,也就是一个子串或者片段,具体格式为:
1 | strname[start : end : step] |
2. List 列表
2.1 列表定义
从形式上看,列表会将所有元素都放在一对中括号 [ ] 里面,相邻元素之间用逗号 , 分隔,如下所示:
1 | [element1, element2, element3, ..., elementn] |
创建列表
在 Python 中,创建列表的方法可分为两种:
- 使用 [ ] 直接创建列表
使用 [ ] 创建列表后,一般使用 = 将它赋值给某个变量,具体格如下:
1 | listname = [element1, element2, element3 , ... , elementkn] |
其中,listname 表示变量名,element1 ~ elementn 表示列表元素。
- 使用 list( ) 函数创建列表
除了使用 [ ] 创建列表外,Python 还提供了一个内置的函数 list( ),使用它可以将其它数据类型转换为列表类型。
1 | # 将字符串转换成列表 |
2.2 增删改查
访问列表元素
列表是 Python 序列的一种,我们可以使用索引(Index)访问列表中的某个元素(得到的是一个元素的值),也可以使用切片访问列表中的一组元素(得到的是一个新的子列表)。
- 使用索引访问列表元素的格式为:
listname[i]
其中,listname 表示列表名字,i 表示素引值。列表的索引可以是正数,也可以是负数。
- 使用切片访问列表元素的格式为:
listname[start:end:step]
其中,listname 表示列表名字,start 表示起始索引,end 表示结束索引,step 表示步长。
Tips:
索引从 0 开始而不是 1 开始,通过将索引指定为 -1,可以得到列表最后一个元素。
1 | url = [1, 2, 3, 4, 5, 6, 7, 8] |
添加列表元素
| 调用函数 | 操作方式 | 示例 |
|---|---|---|
| list.append(元素) | 在末尾处添加 | name.append(‘fish’) |
| 列表扩充 list.extend(list) | 合并其他函数 | names.extend(names) |
| list.insert(索引 , 元素) | 在任意位置添加 | names.insert(0 , ‘fish’) |
| 列表相加 “+” | 合并其他函数 | names + names |
- append( ) 方法
append( ) 方法用于在列表的末尾追加元素,该方法的语法格式如下:
1 | listname.append(obj) |
其中,listname 表示要添加元素的列表;obj 表示到添加到列表末尾的数据,它可以是单个元素,也可以是列表、元组等。
1 | list1 = ['Python', 'C++', 'Java'] |
- extend( ) 方法
extend( ) 方法同样也可以在末尾添加单个元素,但与 append 不同的是,当用 extend( ) 添加诸如列表对象时,不会将其视为一个整体添加进去,而是会将列表对象中的所有元素进行拆分,一个个的添加到新列表的末尾。
1 | list1 = ['Python', 'C++', 'Java'] |
- insert( ) 方法
前面两种方法都是添加到列表的末尾,如果想在列表中间插入元素,可以使用 insert 方法。
1 | list1 = ['Python', 'C++', 'Java'] |
修改列表元素
1 | 【输入】 |
删除列表元素
使用 pop( ) 可以弹出一个元素,一旦使用 pop( ) 之后,被弹出的元素就不在列表中了。
方法 remove( ) 只删除第一个指定的值,如果要删除的值可能在列表中出现多次,就需要使用循环。
| 调用函数 | 操作方式 | 示例 |
|---|---|---|
| del 语句 | 删除某个索引的元素 | del names[0] |
| del 语句 | 删除整个列表 | del names |
| pop( ) 方法 | 弹出末尾元素 | names.pop() |
| pop( ) 方法 | 弹出某索引元素 | names.pop(0) |
| remove( ) 方法 | 删除某个值的元素 | names.remove(‘dog’) |
| clear( ) 方法 | 清空列表中的元素 | names.clear() |
2.3 列表常见操作
组织列表
| 调用函数 | 操作方式 | 示例 |
|---|---|---|
| sort( ) 方法 | 使列表元素按照字母顺序排序 | cars.sort() |
| sorted( ) 方法 | 对列表进行临时排序,也是按字母顺序,但不会永久性改变 | print(sorted(cars)) |
| reverse( ) 方法 | 反转列表元素的排序顺序 | cars.reverse() |
其中 sorted( ) 和 sort( ) 的区别如下:
| 名称 | 类型 | 写法 | 执行结果 | 愿列表是否变化 |
|---|---|---|---|---|
| sort() | 列表的方法 | xxx.sort() | None | 变化 |
| sorted() | 内置函数 | sorted(xxx) | 新列表 | 不变 |
列表复制
下面两段代码不一样:
- 代码一是将 my_foods 复制给了 friend_foods 成为两个列表。
- 代码二则是将 friend_foods 与 my_foods 划等号即实质上两个变量还是用的同一个列表,一方的删减会同步影响到另一方。
1 | # 代码一 |
列表的简单计算
| 函数 | 功能 |
|---|---|
| min(list) | 取列表的最小值 |
| max(list) | 取列表的最大值 |
| sum(list) | 取列表中所有元素的和 |
列表转换成字符串
如果我们想将列表中的字符拼接成一个字符串,则可以使用 join 函数,还可以指定拼接时的连接符。
1 | list1 = ["h", "e", "l", "l", "o"] |
Tips:
不光是列表可以使用 join 函数,下面的元组、字典和集合都可以使用 join 函数,其中字典是会拼接字典中的 key 值。
1 | list1 = ("1", "2") |
3. Tuple 元组
元组(tuple)是 Python 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成。
元组和列表(list)的不同之处在于:
- 列表的元素是可以更改的,包括修改元素值,删除和插入元素,所以列表是可变序列。
- 而元组一旦被创建,它的元素就不可更改了,所以元组是不可变序列。
元组也可以看做是不可变的列表,通常情况下,元组用于保存无需修改的内容。
创建元组
Python 提供了两种创建元组的方法:
- 使用 ( ) 直接创建
通过 ( ) 创建元组后,一般使用 = 将它赋值给某个变量,具体格式为:
1 | tuplename = (element1, element2, ..., elementn) |
如果创建的元组只包含一个元素,则需要在后面加上逗号。
1 | my_t = (3,) |
- 使用 tuple( ) 函数创建元组
除了使用 ( ) 创建元组外,Python 还提供了一个内置的函数 tuple( ),用来将其它数据类型转换为元组类型。
Tips:
元组的访问时的语法与列表相同。
修改元组变量
修改变量不能通过修改列表元素那样去修改,需要重新定义。
1 | dimensions = (200,50) # (200,50) |
4. Dict 字典
4.1 字典定义
Python 字典(dict)是 Python 中唯一的映射类型,是一种无序的、可变的序列,它的元素以 “ 键值对(key-value)” 的形式存储。
字典中将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为 “ 键值对 “。
创建字典
- 使用 { } 创建字典
使用 { } 创建字典的语法格式如下:
1 | dictname = {'key': 'value1', 'key2': 'value2', ..., 'keyn': 'valuen'} |
由于字典中每个元素都包含两部分,分别是键(key)和值(value)。因此在创建字典时,键和值之间使用冒号 : 分隔,相邻元素之间使用逗号 , 分隔,所有元素放在大括号 { } 中。
1 | alien_0 = {'color': 'green','points': 5} |
- 通过 fromkeys( ) 方法创建字典
Python 中,还可以使用 dict 字典类型提供的 fromkeys( ) 方法创建带有默认值的字典,具体格式为:
1 | dictname = dict.fromkeys(list, value=None) |
其中,list 参数表示字典中所有键的列表(list);value 参数表示默认值,如果不写,则为空值 None。
1 | knowledge = ['语文', '数学', '英语'] |
- 通过 dict( ) 映射函数创建字典
格式 1:
1 | dict1 = dict(key1="test1", key2="test2", key3="test3") |
格式 2:
1 | demo = [('two',2), ('one',1), ('three',3)] |
格式 3:
1 | keys = ['one', 'two', 'three'] # 还可以是数值或元组 |
4.2 增删改查
访问字典
列表和元组是通过下标来访问元素的,而字典不同,它通过键来访问对应的值。
- [ ] 访问字典元素
1 | dictname[key] |
其中,dictname 表示字典变量的名字,key 表示键名。注意,键必须是存在的,否则会抛出异常。
- get( ) 方法
1 | dictname.get(key[,default]) |
其中,dictname 表示字典变量的名字;key 表示指定的键,是必不可少的;default 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,就会返回 None,因此是可选的。
1 | alien = {'color': 'green'} |
Tips:
判断字典是否包含指定键值对的键,可以使用 in 或 not in 运算符。
添加、修改和删除键值对
1 | alien = {'color': 'green','points': 5} |
查看 dict 所有方法
Python 字典的数据类型为 dict,我们可使用 dir(dict) 来查看该类型包含哪些方法。
1 | dir(dict) |
遍历字典
现在我定义了一个 favorite 字典,我想遍历字典中的值,则有三种方式可以遍历。
1 | favorite = {'1': 'Python', '3': 'C++', '2': 'Python'} |
- 遍历所有键
1 | # keys()方法用于返回字典中的所有键(key) |
此外,可以通过 sorted( ) 来获得特定顺序排列的键列表的副本:
1 | for name in sorted(favorite.keys()): |
- 遍历所有值
1 | # values()方法用于返回字典中所有键对应的值(value) |
此外,通过对包含重复元素的列表调用 set( ) ,可让 Python 找出列表中独一无二的元素。
1 | for language in set(favorite.values()): |
- 遍历所有键值对
1 | # items()用于返回字典中所有的键值对(key-value) |
4.3 字典嵌套
- 在列表中存储字典
1 | aliens = [] |
- 在字典中存储列表
1 | pizza = { |
- 在字典中存储字典
1 | users = { |
5. Set 集合
Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 { } 中,相邻元素之间用 , 分隔,如下所示:
1 | {element1, element2, ..., elementn} |
创建集合
- 使用 { } 创建
在 Python 中,创建 set 集合可以像列表、元素和字典一样,直接将集合赋值给变量,其语法格式如下:
1 | setname = {element1, element2, ..., elementn} |
集合会帮我们自动去重,并且不会以特定的顺序存储元素。
1 | languages = {'python', 'ruby', 'python', 'c'} |
- set( ) 函数创建集合
set( ) 函数为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合。该函数的语法格式如下:
1 | setname = set(iteration) |
比如下面我将一个字符串转换成集合的形式,则会得到一个去重后的字符集。
1 | str = "helloworld" |
添加、删除集合元素
- 添加元素
set 集合中添加元素,可以使用 set 类型提供的 add( ) 方法实现,该方法的语法格式为:
1 | setname.add(element) |
- 删除元素
删除现有 set 集合中的指定元素,可以使用 remove( ) 方法,该方法的语法格式如下:
1 | setname.remove(element) |
差集、交集和并集
| 运算操作 | Python 运算符 | 含义 | 例子 | ||
|---|---|---|---|---|---|
| 交集 | & | 取两集合公共的元素 | >>> set1 & set2{3} | ||
| 并集 | \ | 取两集合全部的元素 | >>> set1 \ | set2{1, 2, 3, 4, 5} | |
| 差集 | - | 取一个集合中另一个集合没有的元素 | >>> set1 - set2{1, 2}>>> set2 - set1{4, 5} | ||
| 对称差集 | ^ | 取集合 A 和 B 中不属于 A & B 的元素 | >>> set1 ^ set2{1, 2, 4, 5} |
| 方法名 | 语法格式 | 操作说明 |
|---|---|---|
| difference( ) | set3 = set1.difference(set2) |
将 set1 中有而 set 2 没有的元素给 set3 |
| intersection( ) | set3 = set1.intersection(set2) |
取 set1 和 set2 的交集给 set3 |
| union( ) | set3 = set1.union(set2) |
取 set1 和 set2 的并集给 set3 |
1 | list1 = [1, 2, 3, 4, 5] |
6. 获取对象长度
Python 中,要想知道一个对象长度,或者一个字符串占用多少个字节,可以使用 len 函数。
len 函数的基本语法格式为:
1 | len(obj) |
其中 obj 用于指定要进行长度统计的对象,可以是字符串、列表、元组、字典等。
以 UTF-8 编码为例,字符串 “ 人生苦短,我用 Python” 所占用的字节数如下图所示。
Tips:
在 UTF-8 编码中,英文每个字符占用 1 个字节,中文每个汉字占用 3 个字节。
在 gbk 编码中,英文每个字符占用 1 个字节,中文每个汉字占用 2 个字节。
通过使用 encode( ) 方法,将字符串进行编码后再获取它的字节数。例如,采用不同编码方式,计算 “ 人生苦短,我用 Python!” 的字节数,可以执行如下代码:
1 | str1 = "人生苦短,我用Python!" |
7. Python 推导式
推导式 comprehensions(又称解析式),是 Python 的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体,共有三种推导,在 Python2 和 3 中都有支持:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
列表推导式
列表推导式书写形式:
1 | [表达式 for 变量 in 列表] |
可以看一些例子来快速掌握。
1 | list1 = [i for i in range(1, 10)] |
字典推导式
字典推导和列表推导的使用方法是类似的,只不过中括号该改成大括号。
1 | # 快速调换key和value的位置 |
集合推导式
集合推导式跟列表推导式差不多,都是对一个列表的元素全部执行相同的操作,但集合是一种无重复无序的序列,跟列表推导式的区别在于:
- 不使用中括号,使用大括号
- 结果中无重复
- 结果是一个 set( ) 集合
1 | # 自动去重 |


