3.1 列表
py 中没有数组,取而代之的是列表
形式上看,列表会将所有元素都放在一对中括号[ ]里面,相邻元素之间用逗号,分隔
[element1, element2, element3, …, elementn]
内容上看,列表可以存储整数、小数、字符串、列表、元组等任何类型的数据,并且同一个列表中元素的类型也可以不同
[“python”, 1, [2,3,4] , 3.0]
在使用列表时,虽然可以将不同类型的数据放入到同一个列表中,但通常情况下不这么做,同一列表中只放入同一类型的数据,这样可以提高程序的可读性
3.1.1 创建列表
- 使用 [] 直接创建
- 使用 list() 函数创建列表
In [1]: print(list("hi"))
['h', 'i']
3.1.2 访问列表元素
```python str0 = list(“abcdefghijklmn”)
使用索引访问列表中的某个元素
print(str0[3]) #使用正数索引 print(str0[-4]) #使用负数索引
使用切片访问列表中的一组元素
print(str0[9: 18]) #使用正数切片 print(str0[9: 18: 3]) #指定步长 print(str0[-6: -1]) #使用负数切片
<a name="HYm0s"></a>
### 3.1.3 删除列表
直接使用del
<a name="uD8bw"></a>
### 3.1.4 添加元素的方法
1. append(),在列表的末尾追加元素。当给 append() 方法传递列表或者元组时,此方法会将它们视为一个整体,作为一个元素添加到列表中,从而形成包含列表和元组的新列表
1. extend() ,在列表的末尾追加元素。extend() 不会把列表或者元祖视为一个整体,而是把它们包含的元素逐个添加到列表中
1. insert(), 任意位置插入。当插入列表或者元祖时,insert() 也会将它们视为一个整体,作为一个元素插入到列表中
<a name="l0ocA"></a>
### 3.1.5 删除元素的方法
1. del 专门用来执行删除操作,它不仅可以删除整个列表,还可以删除列表中的某些元素
1. 删除列表中的单个元素 -> del listname[index]
1. 以删除中间一段连续的元素 -> del listname[start : end]
2. pop() 方法用来删除列表中指定索引处的元素
2. remove() 方法,该方法会根据元素本身的值来进行删除操作。remove() 方法只会删除第一个和指定值相同的元素,而且必须保证该元素是存在的,否则会引发 ValueError 错误
2. clear() 用来删除列表的所有元素,也即清空列表
<a name="yLw1c"></a>
### 3.1.6 修改元素
1. 修改单个元素
直接使用索引赋值
2. 修改一组元素
使用切片,指定步长
```python
nums = [40, 36, 89, 2, 36, 100, 7]
#修改第 1~4 个元素的值(不包括第4个元素)
nums[1: 4] = [45.25, -77, -52.5]
print(nums)
3.1.7 查找元素
- 直接使用 index 进行查找
:::info
listname.index(obj, start, end)
listname 表示列表名称,obj 表示要查找的元素,start 表示起始位置,end 表示结束位置
start 和 end 参数用来指定检索范围:
- start 和 end 可以都不写,此时会检索整个列表
- 如果只写 start 不写 end,那么表示检索从 start 到末尾的元素
- 如果 start 和 end 都写,那么表示检索 start 和 end 之间的元素
index() 方法会返回元素所在列表中的索引值 :::
count 计算某个元素出现的次数 :::info listname.count(obj)
其中,listname 代表列表名,obj 表示要统计的元素
如果 count() 返回 0,就表示列表中不存在该元素,所以 count() 也可以用来判断列表中的某个元素是否存在 :::3.2 元组
元组是由一系列按特定顺序排序的元素组成,可以看作是不可变的列表。通常情况下,元组用于保存无需修改的内容。
形式上看:元组的所有元素都放在一对小括号( )中,相邻元素之间用逗号,分隔
(element1, element2, … , elementn)
- 存储内容上看:元组可以存储整数、实数、字符串、列表、元组等任何类型的数据,并且在同一个元组中,元素的类型可以不同
tuple 与 list 的不同:
使用 ()直接创建 :::info 通过( )创建元组后,一般使用=将它赋值给某个变量,具体格式为:
tuplename = (element1, element2, …, elementn)
其中,tuplename 表示变量名,element1 ~ elementn 表示元组的元素 ::: 在 Python 中,元组通常都是使用一对小括号将所有元素包围起来的,但小括号不是必须的,只要将各元素用逗号隔开,Python 就会将其视为元组
注意:
当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,,否则 Python 解释器会将它视为字符串使用 tuple() 函数创建元组 :::info 内置函数 tuple(),用来将其它数据类型转换为元组类型:
tuple(data)
data 表示可以转化为元组的数据,包括字符串、元组、range 对象等 :::3.2.2 访问元组元素
可以使用 index 访问某个元素,也可以使用切片访问元组中的一组元素(得到的是一个新的子元组) :::info
- 使用 index 访问元组元素:
tuplename[i]
tuplename 表示元组名字,i 表示索引值。元组的索引可以是正数,也可以是负数
- 使用切片访问元组元素:
tuplename[start : end : step]
start 表示起始索引,end 表示结束索引,step 表示步长
:::
3.2.3 修改元组
元组是不可变序列,因此元组内的元素不可以被修改,但是可以创建一个新的元组代替旧的元组
- 对元组变量进行重新赋值
- 通过连接多个元组(使用+可以拼接元组)的方式向元组中添加新元素(拼接后,原有的两个数组的内容不会发生任何变化,这说明生成的是一个新的元组)
3.2.4 删除元组
直接使用 del 关键字进行删除3.3 字典
字典是一种无序的、可变的序列,元素以 K-V 形式存储,是py中唯一的映射类型3.3.1 特征
| 主要特征 | 解释 | | —- | —- | | 通过键而不是通过索引来读取元素 | 字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取 | | 字典是任意数据类型的无序集合 | 和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素,而字典中的元素是无序的 | | 字典是可变的,并且可以任意嵌套 | 字典可以在原处增长或者缩短(无需生成一个副本),并且它支持任意深度的嵌套,即字典存储的值也可以是列表或其它的字典 | | 字典中的键必须唯一 | 字典中,不支持同一个键出现多次,否则只会保留最后一个键值对 | | 字典中的键必须不可变 | 字典中每个键值对的键是不可变的,只能使用数字、字符串或者元组,不能使用列表 |
3.3.2 创建字典
- 使用 {} 创建 :::info 字典中每个元素都包含两部分,分别是键(key)和值(value),因此在创建字典时,键和值之间使用冒号:分隔,相邻元素之间使用逗号,分隔,所有元素放在大括号{ }中 ::: dictname = {‘key’:’value1’, ‘key2’:’value2’, …, ‘keyn’:valuen}
- 同一字典中的各个键必须唯一,不能重复
- 字典的键可以是整数、字符串或者元组,只要符合唯一和不可变的特性就行;字典的值可以是 Python 支持的任意数据类型
- 通过 fromkeys() 方法创建
使用 dict 字典类型提供的 fromkeys() 方法创建带有默认值的字典:
dictname = dict.fromkeys(list,value=None)
value 可以为空
- 通过 dict() 映射函数创建
| 创建格式 | 注意事项 |
| —- | —- |
| a = dict(str1=value1, str2=value2, str3=value3) | str 表示字符串类型的键,value 表示键对应的值。使用此方式创建字典时,字符串不能带引号 |
| #方式1
demo = [(‘two’,2), (‘one’,1), (‘three’,3)]
#方式2
demo = [[‘two’,2], [‘one’,1], [‘three’,3]]
#方式3
demo = ((‘two’,2), (‘one’,1), (‘three’,3))
#方式4
demo = ([‘two’,2], [‘one’,1], [‘three’,3])
a = dict(demo) | 向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值 | | keys = [‘one’, ‘two’, ‘three’] #还可以是字符串或元组
values = [1, 2, 3] #还可以是字符串或元组
a = dict( zip(keys, values) ) | 通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典 |
- 通过 k 访问 v:dictname[key]
dictname 表示字典变量的名字,key 表示键名。注意,键必须是存在的,否则会抛出异常
- 使用 dict 类型提供的 get() 方法来获取指定键对应的值
当指定的键不存在时,get() 方法不会抛出异常
dictname.get(key[,default])
- dictname 表示字典变量的名字;key 表示指定的键;default 用于指定要查询的键不存在时,此方法返回的默认值, 如果不手动指定,会返回 None
- 当键不存在时,get() 返回空值 None,如果想明确地提示用户该键不存在,那么可以手动设置 get() 的第二个参数
a = dict(two=0.65, one=88, three=100, four=-59)
print( a.get('five', '该键不存在') )
3.3.4 删除字典
直接使用 del 删除3.3.4 字典的基本操作
- 添加键值对
直接给不存在的 key 赋值即可,dictname[key] = value
- 修改键值对
由于 k 是唯一的,因此新添加的元素的 k 与已存在的元素的 k 的 v 相同,那么 k 所对应的 v 就会被新的 v 替换掉,以此来达到修改元素值的目的
- 删除键值对
3.3.5 字典方法
dir(dict)
[‘clear’, ‘copy’, ‘fromkeys’, ‘get’, ‘items’, ‘keys’, ‘pop’, ‘popitem’, ‘setdefault’, ‘update’, ‘values’]
- keys()、values() 和 items() 方法 :::info 它们都用来获取字典中的特定数据:
- keys() 方法用于返回字典中的所有键(key)
- values() 方法用于返回字典中所有键对应的值(value)
- items() 用于返回字典中所有的键值对(key-value)
keys()、values() 和 items() 返回值的类型分别为 dict_keys、dict_values 和 dict_items :::
copy() 方法 :::info copy() 方法返回一个字典的拷贝,也即返回一个具有相同键值对的新字典
copy() 方法所遵循的拷贝原理,既有深拷贝,也有浅拷贝 :::update() 方法 :::info
- update() 方法可以使用一个字典所包含的键值对来更新己有的字典
- 在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去 :::
- pop() 和 popitem() 方法 :::info pop() 和 popitem() 都用来删除字典中的键值对,不同的是,pop() 用来删除指定的键值对,而 popitem() 用来随机删除一个键值对
- dictname.pop(key)
- dictname.popitem() ::: popitem() 随机删除字典中的一个键值对是不准确的,虽然字典是一种无须的列表,但键值对在底层也是有存储顺序的,popitem() 总是弹出底层中的最后一个 key-value,这和列表的 pop() 方法类似,都实现了数据结构中“出栈”的操作
- setdefault() 方法 :::info
- setdefault() 方法用来返回某个 key 对应的 value:dictname.setdefault(key, defaultvalue),defaultvalue 可以不写,不写的话是 None
当指定的 key 不存在时,setdefault() 会先为这个不存在的 key 设置一个默认的 defaultvalue,然后再返回 defaultvalue,即setdefault() 方法总能返回指定 key 对应的 value:
形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔
- 内容上看,同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误
:::
- 数据必须保证是唯一的,因为集合对于每种数据元素,只会保留一份
- 由于 Python 中的 set 集合是无序的,所以每次输出时元素的排序顺序可能都不相同
python中有两种集合,一种是 set 集合,另一种是 forzenset 集合:
- set集合可以做添加、删除元素的操作
- forzenset不可以
3.4.1 创建、访问、删除
- 创建
- 使用 {} 创建
直接将集合赋值给变量,从而实现创建集合的目的
- set() 函数创建集合
set() 函数为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合
setname = set(iteration) - > iteration 就表示字符串、列表、元组、range 对象等数据
- 如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典
- 访问
使用 for 循环遍历
- 删除
3.4.2 set 集合基本操作
- 添加:add()
- 删除:remove()
- set 集合做交并差集运算
| 运算操作 | 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} |
3.4.3 全部方法
>>> dir(set)
['add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
方法名 | 语法格式 | 功能 | 实例 |
---|---|---|---|
add() | set1.add() | 向 set1 集合中添加数字、字符串、元组或者布尔类型 | >>> set1 = {1,2,3} >>> set1.add((1,2)) >>> set1 {(1, 2), 1, 2, 3} |
clear() | set1.clear() | 清空 set1 集合中所有元素 | >>> set1 = {1,2,3} >>> set1.clear() >>> set1 set() |
set()才表示空集合,{}表示的是空字典 |
| copy() | set2 = set1.copy() | 拷贝 set1 集合给 set2 | >>> set1 = {1,2,3}
>>> set2 = set1.copy()
>>> set1.add(4)
>>> set1
{1, 2, 3, 4}
>>> set1
{1, 2, 3} |
| difference() | set3 = set1.difference(set2) | 将 set1 中有而 set2 没有的元素给 set3 | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3 = set1.difference(set2)
>>> set3
{1, 2} |
| difference_update() | set1.difference_update(set2) | 从 set1 中删除与 set2 相同的元素 | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.difference_update(set2)
>>> set1
{1, 2} |
| discard() | set1.discard(elem) | 删除 set1 中的 elem 元素 | >>> set1 = {1,2,3}
>>> set1.discard(2)
>>> set1
{1, 3}
>>> set1.discard(4)
{1, 3} |
| intersection() | set3 = set1.intersection(set2) | 取 set1 和 set2 的交集给 set3 | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3 = set1.intersection(set2)
>>> set3
{3} |
| intersection_update() | set1.intersection_update(set2) | 取 set1和 set2 的交集,并更新给 set1 | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.intersection_update(set2)
>>> set1
{3} |
| isdisjoint() | set1.isdisjoint(set2) | 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.isdisjoint(set2)
False |
| issubset() | set1.issubset(set2) | 判断 set1 是否是 set2 的子集 | >>> set1 = {1,2,3}
>>> set2 = {1,2}
>>> set1.issubset(set2)
False |
| issuperset() | set1.issuperset(set2) | 判断 set2 是否是 set1 的子集 | >>> set1 = {1,2,3}
>>> set2 = {1,2}
>>> set1.issuperset(set2)
True |
| pop() | a = set1.pop() | 取 set1 中一个元素,并赋值给 a | >>> set1 = {1,2,3}
>>> a = set1.pop()
>>> set1
{2,3}
>>> a
1 |
| remove() | set1.remove(elem) | 移除 set1 中的 elem 元素 | >>> set1 = {1,2,3}
>>> set1.remove(2)
>>> set1
{1, 3}
>>> set1.remove(4)
Traceback (most recent call last):
File “
set1.remove(4)
KeyError: 4 |
| symmetric_difference() | set3 = set1.symmetric_difference(set2) | 取 set1 和 set2 中互不相同的元素,给 set3 | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3 = set1.symmetric_difference(set2)
>>> set3
{1, 2, 4} |
| symmetric_difference_update() | set1.symmetric_difference_update(set2) | 取 set1 和 set2 中互不相同的元素,并更新给 set1 | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set1.symmetric_difference_update(set2)
>>> set1
{1, 2, 4} |
| union() | set3 = set1.union(set2) | 取 set1 和 set2 的并集,赋给 set3 | >>> set1 = {1,2,3}
>>> set2 = {3,4}
>>> set3=set1.union(set2)
>>> set3
{1, 2, 3, 4} |
| update() | set1.update(elem) | 添加列表或集合中的元素到 set1 | >>> set1 = {1,2,3}
>>> set1.update([3,4])
>>> set1
{1,2,3,4} |
3.4.4 frozenset 集合
frozenset 集合是不可变序列,程序不能改变序列中的元素
>>> dir(frozenset)
['copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
两种情况下可以使用 fronzenset:
- 当集合的元素不需要改变时,我们可以使用 fronzenset 替代 set,这样更加安全
- 有时候程序要求必须是不可变对象,这个时候也要使用 fronzenset 替代 set。比如,字典(dict)的键(key)就要求是不可变对象