python学习(2)基础数据结构
1. tuple元组:
元组是长度固定,不可改变的序列。创建元组的方法是逗号;
如果想要创建一个更复杂的元组的话吗,还是要用括号,括号之间需要用逗号;
tuple()可以把其他序列或者迭代器转换为序列,存放在元组中的object本身无法修改,但是如果tuple内部的object是可以更改的
那么可以对其进行修改。
tuple用+来合并多个元组
取出元组中元素的方法有多种,其中一种如下图所示:
一种元组方法,可以用来计算某个值出现的次数,list中也有这个方法,
2. List列表
list的内容和大小都可以变;
list函数通常用来局限化迭代器或者生成器,如下图所示:
list添加和移除元素的常用语法:append insert pop remove、
append: a_list.append("foo")
insert: 将元素插入到指定的位置
pop: 移除序列中特定位置的元素,若不指定位置,默认移除最后一个元素
remove: 通过值移除指定的element,如果同一个值在***总多次出现,只移除第一个
检查一个值是否在list中,用in:
合并list:
(1)用+号
(2)通过extend方法,可以添加多个元素
注意:用+做合并是一个运算量较大的操作,因为要创建一个新的list并复制。如果操作的是一个很大的list。用extend会
更好一些
append和extend的区别:append是把元素添加到一个list里,extend是把两个list结合在一起
extend和+的区别:+是创建了一个新的list并返回,运算量大;extend是在原来的list上面作了修改,运算量小
排序:
用sort函数。sort函数有一些比较方便的选项。比如设置一个sort key,这个key也是一个函数,比如我们想要按string的长度来排序
二分搜索和维持一个排好序的list
内建的bisect模块可以实现二分搜索。bisect.bisect是用来寻找插入的位置,而bisect.insert则实际插入元素到指定的位置:
注意,bisect不会检查list是否是排好序的,所以用这个模块之前要把list排序
切片:
[start:stop] 输出的结果包含开头,不包含结尾。所以输出的结果的数量是stop-start,。切片可以用来输出,也可以用来修改list中的某些值
在切片的使用中,可以不用写开头或者结尾
负索引表示倒数开始多少个的意思
两个冒号后面的数代表步长,就是隔几个元素取一次:
用-1能够反转一个list或者tuple:
内建的序列函数:
enumerate(枚举),能够返回一个(i,value)的tuple,通常用来把一个list中的位置和值映射到一个dict字典中
sorted:该函数返回一个新的排好序的序列,而之前提到的.sort方法是直接更改原有的序列,不产生新的序列。
zip:用于pairs(成对)。把多个序列中对应的元素变成一对,最后返回一个含有tuple的list,zip可以接受任意长度的序列,最后返回的结果
取决于最短的序列。zip的一个常见用法是同时迭代多个序列,可以和enumerate搭配起来使用:
如果给我们一个压缩过的序列,我们可以将其解压:
reversed:可以倒叙迭代序列
4. dict 字典
字典创建方法是用{},dict可以像list一样插入:
可以检查dict是否有某个key:
可以使用del或者pop删除值(注意:del和pop都是对key操作)
直接使用keys和values方法能返回dict中key-value组合的迭代器,不过并不按照什么顺序。并且直接使用如果print出来之后会得到如下形式,
需要使用list具现化:
可以使用update来合并两个dict,使用这种方法更改了原有的dict,不会产生新的dict:
如果dict中某个key存在的话,就返回该value,否则的话,九返回一个默认值:
dict中的get和pop方法能够设置默认值,即能把上面的代码简写为:
另外一种常见用法:
而setdefault方法是专门为这个用途存在的,上面的循环可以写成:
使用setdefault()初始化字典键值,使用字典的时候经常会遇到这样一种应用场景:动态更新字典,如果key不在dictionary中那么就添加它
并把它对应的值初始化为空列表[],然后把元素append到空列表中
有效的key类型:
通常的key类型是不可更改的敞亮类型(int, float, string)或者tuple。可以查看一个object是否是hashable,只要是hashable,就可以当做
dict中的key。
5. Set集合
set是无序且元素不重复的。就像key唯一,且没有value的字典,两种方式可以创建,一个是用set函数,一个是用花括号:
,但是创建空set只能使用set(),因为{}是创建一个空字典。
set支持并集、交集和差集
并集表示方式:set1.union(set2)或者set1 | set2
交集表示方式:set1.intersection(set2)或者set1 & set2
注意:set的元素必须是不可更改的,如果想要list一样的元素,只能变为tuple
查看集合的关系:子集和父集: