Python里面的数据结构,基本的有下面几种,列表,集合,元组,对于不同的数据结构当然有不同的表现形式,操作方法了,先来看看各种数据结构的表示方式
#列表
[1,2,3,4,5,6]
#元组
(1,2,3,4,5,6)
#集合
{1,2,3,4,5,6}
#字典
{'name': 'tom', 'age': 11}
列表
列表的特点是,它是一个可变的集合,不仅仅是结构可变,里面还可以放类型不一样的对象,比如
num = [1,2,3,4,"23",True]
for x in num:
print(type(x))
#输出结果为
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'str'>
<class 'bool'>
可以看到同一个集合中可以加入各种类型的数据,不会有类型检测。所以我们在使用的时候在代码的编写上也要注意了。
对列表的常规操作有
获取元素
如果只是单纯地访问元素,我们可以使用切片或者下标num[0…n],不过列表有一个
num = [1,2,3,4,"23",True]
print(num[3])
#输出结果为3
print(num[3:5])
#输出结果为[4, '23']
添加元素
num = [1,2,3,4,"23",True]
#方法1,append方法插入,常用,只能添加一个元素
num.append(3)
#方法2,获取切换的最后一个位置,在这里就是num[6:6]的意思
num[len(num):] = [3]
print(num)
#输出结果为[1, 2, 3, 4, '23', True, 3]
添加一个集合
#添加一个集合,extend扩展的意思
num = [1,2,3,4,"23",True]
1、方法1,extend方法插入,添加一个集合
num.extend([8,5])
2、方法2,切片方法,同上
num[len(num):] = [8,5]
print(num)
#输出结果为[1, 2, 3, 4, '23', True, 3,8,5]
插入元素到指定位置
num = [1,2,3,4,"23",True]
#方法1,insert插入让3成为集合里面下标为1的元素,其他元素往后挪
num.insert(1,3)
#方法2,使用切片
num[1:1] = [3]
print(num)
#输出结果为[1, 3, 2, 3, 4, '23', True]
移除元素
删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。
num = [1,2,3,3,4,"23",True]
num.remove(3)
print(num)
#输出结果为[1, 3, 2, 3, 4, '23', True],只会移除最先匹配到的元素
#如果移除的元素不存在,会抛出下列错误ValueError: list.remove(x): x not in list
还有一些其它的函数
#列表采用的链式结构,pop默认把序列尾部的元素remove并返回,pop(x)代表的是pop指定下标的元素
pop()
pop(x)
#对列表中的元素就地进行排序
sort()
#对列表的元素进行倒排
reverse()
#返回一个列表的副本,可以通过切片[:]来实现
copy()
#计算列表中某个元素x的个数
count(x)
#获取列表中第一个匹配到的元素x的下标,如果没有匹配到的话返回一个错误ValueError: x is not in list
index(x)
#清空列表的元素,和del num[:]的效果是一样的
clear()
字符串也是列表,所以我们适用于字符串的操作,基本上都适合列表,比如下面的用法
num = [1,2,3]
print(num * 3)
#输出结果为[1, 2, 3, 1, 2, 3, 1, 2, 3]
所以列表的操作也变得和字符串一样简单了,但是我们最好还是规范一下代码,这样利用代码的阅读。
元组
元组(tuple)也是一个非常常用的数据结构,区别于列表,元组的一个最大的特性就是不可变。一个元组由数个逗号分隔的值组成,比如:
t = 1,2,3,4,5,'sad',True
print(t)
#输出结果为(1, 2, 3, 4, 5, 'sad', True)
虽然我们定义元组的时候可以不加括号,但是加上括号可以更加适合代码的阅读。
元组可以进行嵌套,类似于广义表一样
a = (1,2,3)
b = (4,5,6)
print((a,b))#必须添加一个括号,否则,print函数会把`,`号转换成空格
不可变
元组是不可变的,这种不可变体现在元素的引用上,比如
num = [1,2,3]
a = (1,2,3,num)
# 对元组元素进行修改会抛出异常TypeError: 'tuple' object does not support item assignment
a[0] = 3
print(a)
num = [1,2,3]
a = (1,2,3,num)
print(a)
#输出结果为(1, 2, 3, [1, 2, 3])
num[0] = 3
print(a)
#输出结果为(1, 2, 3, [3, 2, 3])
可以看到元组虽然是可不变的,但是对于元组里面的list列表是可变的,我们对list进行操作并不会报错。这是因为我们虽然修改了列表,但是元组里面的列表对象指向的内存地址依然是不变的。
当我们想要构建空的元组或者构建只有一个元素的元组
#定义空元组
a= ()
#定义只有一个元素的元组,一定要加上,号,否则无法区分是元组还是单个的对象
b = (1,)
print(a)
print(b)
#输出结果为
()
(1,)
python的语法非常的神秘莫测,不同于其他编程语言,能够直接取出线性序列中的元素
a= (1,2,3)
t1,t2,t3 = a
print(a)
print(t1,t2,t3)
#输出结果为
(1, 2, 3)
1 2 3
集合
另一种比较常见的数据结构是集合(set),和java一样,集合是一个无序不重复元素的集,基本功能包括关系测试和去重(是否包含子集,交集,并集等)
通常我们用大括号或者set()函数来创建集合,使用set()来创建空集合
num = {1,2,3,4,5,6,6}
print(num)
#输出结果为{1, 2, 3, 4, 5, 6}
#检测是否包含元素
print(1 in num)
#输出结果为True
num = {1,2,3,4,5,6,6}
num2 = {0,1,2,3,7,8,9}
#差集,集合A中有,集合B中没有的元素
num3 = num - num2
print(num3)
#输出结果为{4, 5, 6}
#交集,两个集合都包含的元素
num3 = num & num2
print(num3)
#输出结果为{1, 2, 3}
#并集,融合两个集合,去除重复的部分
num3 = num | num2
print(num3)
#输出结果为{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
#异或,存在于集合A或者集合B,但不同时存在于两个集合中
num3 = num - num2
print(num3)
#输出结果为{0, 4, 5, 6, 7, 8, 9}
有一种集合推导式语法:
num= [x for x in list(range(20)) if x % 2 != 0]
print(num)
#输出结果为{1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
num= {x for x in "ababababababbae" if x not in "abc"}
print(num)
#输出结果为{'e'}
字典
字典相当于java中的map,字典以key作为索引,关键字key可以是任意不可变类型,如果会比的话,就无法求得相同的索引了,通常用字符串或数值。如果元组中只是包含字符串或者数字的话,元组也是可以作为关键字使用的,但是如果元组中包含像列表这样的可变对象,那么就不能够作为关键字了。
字典是一个无序的键值对组合,使用{}
来创建空的字典。基本上在java中对map的操作都适用于python里面的字典,比如对key相同的键值对进行写入的话,会覆盖原来的value,不过要是访问不存在的key,在java里面会返回null,而且python中会返回None,但是python中还可以设置默认的值
person= {'name': 'tom', 'age': 11}
grade = person.get('grade')
print(grade)
#输出结果为None
person= {'name': 'tom', 'age': 11}
grade = person.get('grade','grade first')
print(grade)
#输出结果为grade first
对一个字典执行 list(d.keys())
将返回一个字典中所有关键字组成的无序列表(如果你想要排序,只需使用 sorted(d.keys())
使用 in
关键字可以检查字典中是否存在某个关键字(指字典),使用del可以删除key关键字,或者删除整个字典,删除之后如果再访问字典,就会抛出NameError: name 'person' is not defined
对象未定义的异常
构造字典可以使用{},也可以使用dict()构造函数
person = dict([('name','tom'), ('age',11)])
print(person)
#输出结果为{'name': 'tom', 'age': 11}
person = dict(name='tom',age=11)
print(person)
#输出结果为{'name': 'tom', 'age': 11}
也可以使用字典推导式创建字典
num = {x:x**2 for x in range(5)}
print(num)
#输出结果为{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}