数据结构:
从计算机存储,组织数据的结构
四种常用的数据结构:
1.列表(List)
2.元组(Tuple)
3.字典(Dictionary)
4.集合(Set)
1.列表List(最基础也是最简单的数据结构)
列表中有两种索引方式:
正序索引(第一个元素索引下标为0开始)和倒序索引(最后一个元素索引下标为-1)
列表中可以存储任何类型的数据:
例:变量名 = ["元素1","元素2"..]
列表范围取值:
变量名 = [起始索引 : 结束索引] 需要注意在Python中列表取值范围是“左闭右开”(最右边的索引指向的数值不取)
列表的index函数:
用于获取指定元素的索引值,但是只能返回遇到的第一个元素。例:List.index("张三")。在这里如果要获取所有相同元素的索引值,需要变量列表。
列表的遍历(for循环):
for...in... 语句: 其中in是成员运算符,用于判断数据是否存在列表中,存在返回true,否则为flase
for 迭代变量 in 可迭代对象:
循环体(要记得缩进)
获取列表的长度:
len(列表名)函数
解决完善上面提出的问题:
perosn = ["张三" , "李四" , "王五" , "赵六" , "王五"]
i= 0 #正序
count = len(perosn) #长度
for p in perosn:
ri = count * -1 + i #倒序
if p == "王五":
print(p ,i ,ri)
i+=1
列表的翻转与排序:
翻转:列表名.reserve()函数
排序:列表名.sort()函数 默认升序排列 列表名.sort(reserve = true) 降序排序
列表的增,删,改:
list.append(新元素) 在列表末端追加新元素
list.insert(索引,新元素) 在指定索引插入新元素
list[索引] = 新值 更新指定索引位置数据
list[起始索引:结束索引] = 新列表 更新指定范围数据
list.remove(元素) 删除指定元素
list.pop(索引) 按索引删除指定元素
list[起始索引:结束索引] = [] 大范围删除元素
其他常用函数:
list.count() 统计元素出现次数
list.extend() 扩展列表 注:append将整个列表追加到末尾,extend则是将列表中的元素最加到原始列表末尾
list.copy() 用于复制列表
list。clear() 用于清空列表
身份运算符 is 用于判断两个变量是否指向同一个内存区域
列表小demo ——> 移步到Python数据结构demo
列表存储数据的缺陷:列表在表达结构化数据(指有明确属性,明确表示规则的数据)时语义不明确
2.字典Dictionary(适合表达结构化数据,是Python中内置的数据结构)
字典采用key:value的形式表达数据。key不允许重复。
字典的创建方式有两种:
1.{} 2.dict函数 例:dict1 = {'name' : 'cia鸟','age' : '22'} dict2(name = 'cia鸟', age = '22')
fromkeys函数 —> 初始化字典value值 例:dict.fromkeys(['name','age','weight'],'N/A')
字典的取值操作:
1.字典名['key']直接获取 2.使用get函数获取
get函数 —> 提供生成不存在的key值的方法并可以为其赋值 例:dict.get('salary','8000')
遍历字典:
1.for key in 字典名:
2.for k,v in 字典名.items():
字典的更新和删除:
update函数 —> 字典名.update(key = new value)
字典的新增操作和更新操作完全相同,秉承有则更新,无则新增原则
删除操作:1.pop函数 —> 删除指定的kv 2.popitem函数 —> 删除最后一个kv 3.clear函数 —> 清空字典
例:字典名.pop(key)
字典的常用操作:
1.setdefault()函数 —> 为字典设置默认值,如果key已存在则忽略,否则设置
2.获取字典的视图 keys()/values()/items()
字典格式化字符串:
1.老版本格式化方法:str = "姓名:%(name)s,年龄:%(age)s"%(字典名)
2.新版本格式化方法3.0以上:str = "姓名:{name},年龄:{age}".format_map(字典名)
散列值(hash)和字典的存储原理:
字典也称为“哈希”,对应“散列值”,散列值是从任何一种数据中创建数字的指纹。Python中提供了hash()函数生成散列值。
数字的散列值是本身。key 转换—> hash() 存储—> 内存地址/value
字典小demo ——> 移步到Python数据结构demo
3.元组Tuple(“不可变”的列表)
元组使用小括号,列表使用大括号
元组只认括号内有没有逗号,有则为元组,没有则为算数优先级运算符
元组的读与写:
1.元组的读取方式与列表基本相同 2.元组的元素在创建后不允许修改,若元组内持有列表,那么列表的内容是允许被修改的 3.元组允许使用“元组运算符”来创建新元组
元组的创建:
例:tup = ('a','b',1,2,3)
元组运算符(元组运算符同样适用于列表):
运用运算符简化元组的操作
例:tup = (1,2,3) + (4,5,6) 输出(1,2,3,4,5,6)
tup = ('cia','niao')*2 输出('cia','niao','cia','niao')
注:如果元组只有一个元素时,必须在这个元素后面增加一个逗号说明这是一个元组
例:t = (10,) —> 为只有一个元素的元组
t = (10) —> 不是一个元组,括号只表示算数优先级
列表和元组的区别:
| 列表 | 元组 |
| 内容允许扩展 | 内容不可变 |
| 内存存储动态变化 | 创建后固定不变 |
| 效率较低 | 效率最高 |
| 运行时数据变更使用 | 用于保存稳定不变的数据 |
| 保存天气数据,股市数据 | 保存国家名,元素周期表 |
补充:
序列(不是某一种数据类型,是一类数据结构的统称):
1.序列中的元素顺序按添加顺序排列 2.序列中的数据通过“索引”进行获取
序列包含常用数据结构:
字符串str 列表list 元组tuple 数字序列range
数字序列range:
1.range内容不可变 2.使用range()函数创建 3.语法:r = range(0,100) #产生0~99数字序列,左闭右开 4.range的第三参数可以选择使用,为步长即间距
利用range遍历序列list:
for i in range(0,len(list)): print(list[i])
使用range列出斐波那契数列 —> 移步到Python数据结构demo
序列类型的互相转换:
list() - 转换为列表 tuple() - 转换为元组 join(),str() - 转换为字符串
l1 = ['a', 'b', 'c']
t1 = ('d', 'e', 'f')
s1 = 'abc123'
s2 = 'abc,123'
r1 = range(1, 40)
# list() - 转换为列表
l2 = list(t1)
print(l2)
print(list(s1))
print(s2.split(","))
print(list(r1))
# tuple() - 转换为元组
print(tuple(l1))
print(tuple(s1))
print(tuple(s2.split(",")))
print(tuple(r1))
# str函数用于将单个数据转为字符串 join对列表进行连接
print(str(l1))
print(",".join(l1))
print("|".join(t1)) #join必须要求所有元素都是字符串
s3 = "" #将包含数字的序列输出
for i in r1:
s3 += str(i)
print(s3)
4.集合Set(可以看做没有value的字典)
集合的特点:
1.集合元素是无序的 2.集合元素不能重复 3.集合是可变的 4.集合允许数学运算 5.集合是分散存储的
集合存储原理(集合存储效率高,但是浪费内存空间):
集合(转换) —> hash()(存储) —> 内存地址/数据
集合的创建:
1.使用{}直接创建 2.使用set函数从其他数据类型转换
例:set = {“CIA”,“鸟”} set([“CIA”,“鸟”])
使用set创建字符串集合 例:set("一只cia鸟") —> {无序输出字符集}
空字符的创建:
college = {} —> 创建的是字典
需要加上 college = set() 进行转换 —> 创建集合
集合的数学运算:
交集intersection() / intersection_update(),并集union(),差集difference() / difference_update() / symmetric_difference() 双向差集
子集issubset(),父集issuperset(),isdisjoint()判断是否存在重复元素 用法:a.方法名(b)
集合的遍历:
for i in set:
判断元素存在:
in运算符,集合不支持按索引查找数据(无序)
集合的增,删,改:
1.增 add()一次添加一个 update()一次添加多个
2.删 remove()不存在会报错 discard()不存在则忽略删除操作
3.改 更新需要先将原有的数据删除再添加,比较麻烦
常用生成式:
生成式中可以写多个循环和判断的语句
1.列表生成式 例:list = [i*10 for i in range(0,10) if i%2 == 0] 等价于 list=[] for i in range(0,10) if i%2==0 list.append(i*10)
2.字典生成式 例:lsit = ["一只","CIA鸟"] dict = {i:list[i] for i in range(0,len(list))}
3.集合生成式 例:set = {i for i in range(1,4)}
浙公网安备 33010602011771号