python数据结构

各种数据结构区别

列表

列表相当于c中的数组,不过python的列表对每个元素没有同一类型要求,索引从0开始,也可以从后面-1开始, 以[]表示

列表是动态分配内存的

1
2
3
lst=['hello', 'world' , 98]
print(id(lst))
print(type(1st))print(lst)

输出

1
2
3
000000000000
<class 'list'>
['hello', 'world', 98]

列表的创建可以直接赋值,或者使用list()函数

元素的索引

index()函数,查找元素的索引,如果有相同只返回第一个

1
list.index('')

获取列表的切片

1
2
#列表名[ start : stop : step ]
print (lst[1:6:1])

切出来是一个新的列表对象

列表的遍历

for 迭代变量 in 列表条:
操作

列表元素的增、删、改

1
2
3
4
5
6
7
8
lst.append()#增加后还是原来的列表,把对象作为一个对象添加
lst.extend()#把对象内的所有元素都添加进去
lst.insert(1,90)#任意位置插入
lst.remove()#删除一个元素,重复只删第一个
lst.pop()#pop()根据索引移除元素,如果不写索引,删除最后元素
lst.clear()#清空列表
lst.del()#删除列表
lstl[1:3] [300, 400, 50,]#切片修改

列表元素的排序

1
2
3
4
5
lst.sort()#升序排列,对原对象进行操作
lst.sorted()#降序排列,产生新的对象
lst. sort (reverse= True)
#reverse=True表示降序排序,reverse=False就是 升序排序
lst. sort (reverse=False)

列表推导式

1
2
list=[i*i for i in range(1,10)]
#[1,4,9,16,25,36,49,64,81]

表达式 for 变量 in 可迭代对象

字典

以花括号表示{},是python的内置数据结构

字典内以键值对存储(key,vaule),无序排列

字典的创建

使用花括号

scores={ “1’: 1, ‘2’ : 2 }

使用内置函数dict()

dict( name=’ ’ , age=1 )

字典元素的获取

[“”]用花括号获取,如果查不到会报错

用get()方法 ,查不到返回null

1
2
get('张三')
get('张三'100)

字典元素的增删改操作

del删除

clear()清空

keys()获取字典中所有key

values()获取字典中所有value

items() 获取字典中所有key,value对

items转换之后的列表元素是由元组组成

字典元素的遍历

1
2
for item in scores:
print(item,scores.get(item))

字典生成式

1
{ item:price for item,price in zip(items,prices)}

字典表达式 字典变量 可迭代对象

元组

不可变序列,没有增删改查操作,使用小括号()

元组创建

直接创建,可省略小括号

t=( ‘Python; ‘hello’, 90 )

内置函数tuple()

t= tuple( (‘Python’, ‘hello’ , 90) )

只包含一个元组的元素需要使用逗号和小括号

t=( 10,)

元组遍历

1
2
for item in t:
print(item)

集合

可变类型的序列,没有vaule的字典,用{}花括号,集合中的元素不允许重复

集合创建

直接{}

s={ ‘Python’ , ‘hello’}

使用内置函数set()

1
2
3
4
5
6
7
s= set(range(6))
print(s)
print(set([3,4,53,56]))#将列表转化成集合
print(set((3,4,43,435)))#将元组转化成集合
print(set('Python'))#将字符串转化成集合
print(set({124,3,4,4,5}))
print(set())#定义空集合

集合操作

集合元素的判断操作in或not in

集合元素的新增操作

add()方法,一次添中一个元素

update()方法,添中多个元素

集合元素的删除操作

remove()方法,一次删除一个指定元素,指定的元素不存在抛出异常

discard()方法,一次删除一个指定元素,如果指定的元素不存在不抛出异常

pop()方法,一次只删除一个任意元素

clear()方法,清空集合

关系运算

集合也能进行关系运算

两个集合是否相等

可以使用运算符==或!=进行判断

一个集合是否是另一个集合的子集issubset

一个集合是否是另一个集合的超集issuperset

两个集合是否有交集isdisjoint()

集合数学操作

交集 intersection() &

并集 union() |

差集 difference() -

对称差集 symmetric_difference() ^

a并b-a交b

集合生成式

1
list={i*i for i in range(1,10)}

字符串

字符串驻留机制

python中的字符串,只保留一份拷贝,声明相同的字符串,不会创建新内存空间

驻留机制的几种情况

  • 字符串的长度为0或1
  • 符合标识符的字符串(不符合的不会驻留,比如加上%)
  • 字符串只在编译时进行驻留,而非运行时
  • [-5,256]之间的整数数字

在拼接时建议使用str类型的join方法,而非+ ,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率比”+”效率高

常用操作

查询

方法 作用
index() 查找子串第一次出现的位置,不存在抛出异常
rindex() 查找子串最后一次出现的位置,找不到抛出异常
find() 查找子串第一次出现的位置,不存在时返回-1
rfind() 查找子串最后一次出现的位置,子串不存在时返回-1

大小写转换

方法 作用
upper() 转成大写
lower() 转成小写
swapcase() 大写转成小写,小写转大写
capitalize() 第一个字符转换为大写,把其余字符转换为小写
title() 把每个单词的第一个字符转换为大写,把每个单词的剩余字符转换为小写

对齐

方法 作用
center() 居中对齐,第1个参数指定宽度,第2个参数指定填充符(可选),默认空格
ljust() 左对齐,第1个参数指定宽度,第2个参数指定填充符(可选),默认空格
rjust() 右对齐,第1个参数指定宽度,第2个参数指定填充符(可选),默认空格
zfill() 右对齐,左边用0填充,有一个参数,指定字符串的宽度

分割

方法 作用
split() 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回一个列表
rsplit() 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回一个列表
参数
sep 指分割符
maxsplit 指定最大分割次数
在最大次劈分之后,剩余子串单独做为一部分

判断

方法 作用
isidentifier() 是否合法
isspace() 是否全部由空白字符组成(回车、换行,水平制表符)
isalpha() 是否全部由字母组成
isdecimal() 是否全部由十进制的数字组成
isnumeric() 是否全部由数字组成
isalnum() 是否全部由字母和数字组成

替换

方法 作用
replace() 参数
第一个,指定被替换的子串
第二个,指定替换子串的字符串
第三个,指定最大替换次数
join() 将列表或元组中的字符串合并成一个字符串

字符串的比较

可以进行>,>=,<,<=,==,!=运算

比较规则

先比较第一个,若相等就往后比;如果不同时,比较字符的ascall值,返回true或false

==比较的是值,is比较的是内存地址

字符串的切片

切片会产生新的内存

语法[start : end::step]

步长可以省略

1
2
3
4
s='hello,python'
s1=s[:5]
s2=s[6:]
newstr=s1+s2

格式化字符串

百分号%

1
2
3
name='张三'
age=20
print('我叫%s,今年%d岁'% (name, age))

花括号{}

1
print ('我叫{0},今年{1}岁'.format(name, age))

f格式化(python3以上)

1
print(f'我叫{name},今年{age}岁')

精度

1
2
3
4
5
print(’%10d’% 99)#10表示的是宽度
print (%.3f’% 3.1415926)#保留三位小数
print('{0:.3}'.format(3.1415926))#.3表示的是共是3位数
print('{0:.3f}'.format (3.1415926)) #.3f表示是3位小数
print('{:10.3f}'.farmat(3.1415926))#宽度10位,三位小数

字符串的编码转换

1
2
3
4
5
6
7
8
9
10
11
12
#编码
print(s.encode(encoding='GBK'))
#一个字占两个字节
print(s.encode(encoding='UTF-8'))
#一个字占三个字节

#解码
#byte代表就是一个二进制数据(字节类型的数据)
byte=s.encode(encoding='GBK')#编码
print(byte.decode (encoding=' GBK'))#解码
byte=s.encode(encoding='UTF-8')
print (byte.decode(encoding='UTF-8'))