Python学习记录6-list、tuple、dict、set复习
数据类型在一门语言中是非常重要的,所以选择再次学习一下加深记忆。本次主要参考了大神廖雪峰的官方网站,非常感谢大神,讲的很清晰,收获很大。
标准数据类型
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元祖)
- Set(集合)
- Dictionary(字典)
按是否可变分类
- 不可变数据(3个)
- Number(数字)
- String(字符串)
- Tuple(元祖)
- 可变数据(3个)
- List(列表)
- Dictionary(字典)
- Set(集合)
List(列表)
- Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
>>> friends = ['小明','小红','小王'] #创建一个list集合
>>> print(friends) #打印
>>> print(type(friends)) #friends变量的类型是list
>>> print(len(friends)) #使用len()函数可以获得list元素的个数
['小明', '小红', '小王']
<class 'list'>
3
#空的list,长度为0
>>> L = []
>>> print(len(L))
0
- 可以用索引访问list中的每一个位置的元素,从0开始
>>> print(friends[0])
小明
>>> print(friends[1])
小红
>>> print(friends[2])
小王
>>> print(friends[3]) #当索引超出范围时,会报IndexError错误
IndexError: list index out of range
#还可以使用负数做索引,-1表示最后一个元素,以此类推
>>> print(friends[-1])
小王
>>> print(friends[-2])
小红
>>> print(friends[-3])
小明
- list是一个可变的有序列表,可以向list中追加元素
1.追加到末尾
>>> friends.append('小张')
>>> print(friends)
['小明', '小红', '小王', '小张']
2.插入到指定位置
>>> friends.insert(1,'小李')
>>> print(friends)
['小明', '小李', '小红', '小王', '小张']
3.删除末尾元素
>>> friends.pop() #删除末尾的元素并返回 这个类似于栈结构的出栈操作
小张
>>> print(friends)
['小明', '小李', '小红', '小王']
4.删除指定位置的元素,使用pop(i),i是索引的位置
>>> friends.pop(2)
小红
>>> print(friends)
['小明', '小李', '小王']
5.替换元素,只需要直接给对应索引位置赋值
>>> friends[0] = '我是替换后的值'
>>> print(friends)
['我是替换后的值', '小李', '小王']
- list中的元素的数据类型可以是不同的
>>> L = [1,'HaHa',False]
- list中存放另一个list
>>> L1 = ['哈哈哈','嘻嘻嘻',['啦啦','咚咚'],'要不起']
>>> print(len(L1)) #长度还是4 因为L1中还是4个元素 只不过其中一个元素是List
>>> print(type(L1))
4
<class 'list'>
#或者拆开写
>>> L2 = ['啦啦','咚咚']
>>> L3 = ['哈哈哈','嘻嘻嘻',L2,'要不起']
>>> print(L3)
['哈哈哈', '嘻嘻嘻', ['啦啦', '咚咚'], '要不起']
#list中存放另一个list时的取值,类似多维数组
>>> print(L3[2][0]) #取L2中的第一个元素的值
啦啦
Tuple(元祖)
- 首先tuple是一个有序但不可变列表,一旦初始化就不能修改,因此没有append(),insert()这种修改操作的方法,因此相对list较安全
#tuple的创建用的是()
>>> friends = ('小明','小红','小王')
>>> print(len(friends))
>>> print(type(friends))
3
<class 'tuple'>
#以逗号隔开,小括号可以省略
>>> friends = '小明','小红','小王'
>>> print(type(friends))
<class 'tuple'>
#空tuple
>>> friends = ()
>>> print(friends)
>>> print(len(friends))
()
0
#取值还是跟list一样的,索引取值 切片取值也可以,跟list一样
>>> print(friends[0]) #小明
>>> print(friends[1]) #小红
>>> print(friends[2]) #小王
>>> print(friends[-1]) #小王
>>> print(friends[-2]) #小红
>>> print(friends[-3]) #小明
#测试是否可变
>>> friends = ('小明','小红','小王')
>>> friends[0] = '小李' #尝试将friends元祖的第一个元素变成'小李'
#直接报错 tuple元祖是不支持写的,是只读的,由此可见tuple确实是一个不可变列表
TypeError: 'tuple' object does not support item assignment
- 创建tuple时需注意的地方
#定义一个只有一个元素的tuple时,需要加上一个逗号,当然是英文的。
#如果不加
>>> t = (1)
>>> print(type(t))
<class 'int'> #可以看到这么定义python会当成数字处理 因为小括号既可以表示tuple类型,又可以表示数学中的小括号,此时会按数学中小括号计算,所以还是数字1
#所以,当只有1个元素的tuple定义时候必须加上一个逗号,
>>> t = (1,)
>>> print(type(t))
>>> print(t)
<class 'tuple'> #此时可以看到类型就是tuple了
(1,) #当然,显示的时候也会加上一个逗号,表示这是一个只有一个元素的tuple
- tuple中放入可变列表list
>>> t1 = ['aa','bb'] #首先创建一个list集合
>>> t2 = ('a','b',t1) #将t1放入t2这个元祖中,此时t2 = ['a','b','aa','bb']
>>> t2[2][0] = 'AA' #改变t1中t2的元素的值
>>> t2[2][1] = 'BB' #改变t1中t2的元素的值
>>> print(t2)
['a','b','AA','BB'] #打印输出后发现里面的值确实改变了,这是否违反了tuple是不可变的呢
#虽然元祖t1中的list集合t2中的元素发生了改变,但实际上元祖t1中的指向的t2对象是没有改变的,
#改变的list中元素的指向,因为list是可变的。因此要创建一个内容也不可变的tuple,就必须保证
#tuple中的每一个元素本身也不能变,比如最开始列举的Number和Str类型。
-
tuple相关的内置函数(与list相仿)
1.len(tuple):计算元祖元素个数
2.max(tuple):返回元祖中元素最大值
3.min(tuple):返回元祖中元素最小值
4.tuple(seq):将列表转换为元祖 -
tuple的方法
1.count():返回元素在tuple中出现的次数
2.index():查找元素第一次出现位置的索引值 -
tuple与list对比
1.定义方式基本相同,tuple是小括号(可省略),list是方括号
2.都是有序的,按定义的次序排序,都支持索引、负索引、切片访问
3.tuple是不可变的,因此不能增、删、改元素(没有例如append、extend、remove、pop等方法)
4.tuple比list操作速度快,需要频繁遍历时推荐使用tuple代替list。并且只可读,相当于对数据进行了“写保护”,使代码更安全。
5.tuple和list可以互相转换,并返回一个新的集合。tuple转list后,由不可变转可变;list转tuple后,由可变转不可变。从效果上看,tuple冻结一个list,而list解冻一个tuple(这句话写的很形象)
Dict(字典)
- dict是python中的字典类型,类似于java中的map,使用键-值(key-value)存储,查找速度极快,但内存消耗量大。
#定义一个Dict 使用大括号{}
>>> d = {'Mick':96,'Jack':97,'Lucy':98}
#输出
>>> d['Mick']
96
#dict是以hash的方式存储数据,其复杂度为O(1),查找速度极快,是因为在存放时,就根据key算出了value的存放位置,这样取得时候就能根据key直接拿到value,显然这样做会加大内存的消耗,也是典型的空间换时间的做法。
#dict也是一个值对应一个value,因此key是不允许重复的,如果多次对一个key放入value,后面将覆盖前面的
>>> d['Mick'] = 100
>>> print(d['Mick'])
100
>>> d['Mick'] = 200
>>> print(d['Mick'])
200
#上面这些都很好理解,跟java的map很相似。
#判断一个dict中是否存在某个key,使用in,返回Ture或False
>>> print('Mick' in d)
True
#也可以使用dict提供的get(),如果key不存在,返回None或自己指定返回值
>>> d.get('HHH') #不存在key返回None
None
>>> d.get('HHH','不存在') #不存在key并且自己指定返回值
None 不存在
#dict删除元素 使用pop(key)
>>> d.pop('Mick') #返回弹出的值:100
100
>>> print(d)
{'Jack': 97, 'Lucy': 98}
- dict与list相比
1.dict查找和插入速度极快,不会因数据量增加而变慢,复杂度为O(1),而list正好相反
2.dict占用内存大,内存浪费多,list相反
3.由于dict要根据key来计算value的存储位置,因此每次计算相同的key的结果必须相同的(key的hash值),作为key的对象就不能变,所以dict的key必须为不可变对象,例如Number和Str,而list是可变的就不行。
#尝试一下list作dict的key值
>>> a = [1,2,3]
>>> d={a:'a'}
>>> print(d)
TypeError: unhashable type: 'list' #可以看到报错 不可取hash值的类型
字典类型的常见方法
D.clear() #移除D中的所有项
D.copy() #返回D的副本
D.fromkeys(seq[,val]) #返回从seq中获得的键和被设置为val的值的字典。可做类方法调用
D.get(key[,default]) #如果D[key]存在,将其返回;否则返回给定的默认值None
D.has_key(key) #检查D是否有给定键key
D.items() #返回表示D项的(键,值)对列表
D.iteritems() #从D.items()返回的(键,值)对中返回一个可迭代的对象
D.iterkeys() #从D的键中返回一个可迭代对象
D.itervalues() #从D的值中返回一个可迭代对象
D.keys() #返回D键的列表
D.pop(key[,d]) #移除并且返回对应给定键key或给定的默认值D的值
D.popitem() #从D中移除任意一项,并将其作为(键,值)对返回
D.setdefault(key[,default]) #如果D[key]存在则将其返回;否则返回默认值None
D.update(other) #将other中的每一项加入到D中。
D.values() #返回D中值的列表
Set(集合)
- set是一个无序的不重复元素序列,set和dict类似,但是值存key不存储value,并且由于key不能重复,所以set中的key是不会重复的,可以用来去重
#创建空集合 不能用{}来创建空的set集合 用{}创建的是dict类型 空的set需要用set()来创建
>>> s1 = set() #这种方式创建的是一个空set
>>> print(type(s1))
<class 'set'>
>>> s2 = set{} #这种方式不存在
>>> s2 = {} #这样创建的是空dict
>>> print(type(s2))
<class 'dict'>
#用可迭代对象创建一个新的集合对角
>>> s = set([1,2,3,4]) #放入一个list创建一个set
>>> print(type(s))
>>> print(s)
<class 'set'>
{1, 2, 3, 4}
#放入一个Str类型
>>> s = set('abcdefg')
>>> print(type(s))
>>> print(s)
<class 'set'>
{'a', 'g', 'f', 'd', 'b', 'c', 'e'} #set集合是无序的 这里也可以看出这个顺序没有按照abcdefg我们定义的顺序排序
#通过set(value)创建的set集合,value必须是可迭代的
#假如放入不可迭代的对象
>>> s = set(1) #放入int类型后报错 int类型是不可迭代的
TypeError: 'int' object is not iterable
#重复元素在set中自动去重
>>> s= set([1,1,2,2,3])
>>> print(s)
{1, 2, 3}
#添加元素到set中,使用add(key)方法,重复添加无效
>>> s = set([1,2,3,4])
>>> print(s)
{1,2,3,4}
>>> s.add(1)
>>> s.add(2)
>>> s.add(3)
>>> s.add(4)
>>> print(s)
{1,2,3,4}
#删除set中的元素,使用remove(key)方法
>>> s = set([1,2,3,4])
>>> s.remove(1)
>>> print(s)
{2, 3, 4}
- 数学运算
set可以当成数学上的无序无重复元素的结合来用,可以进行交集、并集、差集、反交集、子集和超集等操作。
#1.交集
>>> set1 = {1,2,3,4,5}
>>> set2 = {4,5,6,7,8}
>>> print(set1 & set2)
>>> print(set1.intersection(set2))
{4, 5}
{4, 5}
#2.并集
>>> set1 = {1,2,3,4,5}
>>> set2 = {4,5,6,7,8}
>>> print(set1 | set2)
>>> print(set2.union(set1))
{1, 2, 3, 4, 5, 6, 7,8}
{1, 2, 3, 4, 5, 6, 7,8}
3.子集和超集
>>> set1 = {1,2,3}
>>> set2 = {1,2,3,4,5,6}
>>> print(set1 < set2)
>>> print(set1.issubset(set2)) #这两个相同,都是说明set1是set2子集。
True
True
>>> print(set2 > set1
>>> print(set2.issuperset(set1)) #这两个相同,都是说明set2是set1超集。
True
True
- frozenset不可变集合
#frozenset是不可变的,对一个frozenset就不能再使用add和remove方法
>>> s = frozenset('James')
>>> print(s)
>>> print(type(s))
frozenset({'e', 's', 'J', 'a', 'm'})
<class 'frozenset'>
#尝试修改frozenset集合,会直接报错
>>> s.add('a')
'frozenset' object has no attribute 'add'
>>> s.remove('J')
'frozenset' object has no attribute 'remove'
本次主要是对list、tuple、dict和set四种类型数据进行了复习和总结,当然还有其他的包括他们的各种方法以及应用场景没有总结到,后面学习中遇到了会再次总结。上面的例子也是参考了很多博客的大神,但是每一个例子都是我自己手动尝试并总结的,一天下来收获很大,我会继续努力。