当前位置: 首页 > news >正文

Python数据结构

数据结构的含义

在学习数据结构之前,我们先来了解下数据结构的含义。数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构。在Python语言中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号————即元素的位置,称为索引或下标,索引从0开始递增。

典型的序列包括列表、元组和字符串。其中,列表是可变的(可修改),而元组和字符串是不可变的(一旦创建了就是固定的)。列表、元组和字符串也是较常用的数据结构。

本篇内容主要讲解Python的列表、元组、字典,下篇将会介绍字符串的操作。

列表 list,使用 [] 定义,[] 中的各个元素,用逗号分隔。

例子

  • 定义一个名为 all_star,包含 Kobe,TMAC,LBJ元素的列表
>>> all_star = ["Kobe","TMAC","LBJ"]
>>> print(all_star)
['Kobe', 'TMAC', 'LBJ']
复制代码
  • 列表也可以包含列表,例如:
>>> east_star = ["Irving","Wall","Love"]
>>> west_star = ["Curry","KD","Harden"]
>>> all_star = [west_star,east_star]
>>> print(all_star)
[['Curry', 'KD', 'Harden'], ['Irving', 'Wall', 'Love']]
复制代码
  • 或者
>>> all_star = [["Kobe","TMAC"],["LBJ","BOSH"]]
>>> print(all_star)
[['Kobe', 'TMAC'], ['LBJ', 'BOSH']]
复制代码

列表支持增删改查

所有序列类型都可以进行某些特定操作,由对象属性决定。这些操作包括:索引(indexing)、切片(sliceing)、加(adding)、乘(multiplying)以及检查某些元素是否属于序列成员、计算序列长度、找出最大、最小元素的内置函数。

查,使用单个索引一次能取出一个元素,使用切片,可以取出指定范围内的元素,分片通过两个冒号相隔的两个索引值实现。

  • 例子1,单个索引获取元素,获取all_star列表中名叫Kobe的元素
>>> all_star = ["Kobe","TMAC","LBJ"]
#元素的下标也就是索引,从0开始,逐个递增。Kobe的元素下标为0,TMAC为1,LBJ为2
>>> print(all_star[0]) 
Kobe
>>> all_star = [["Kobe","TMAC"],["LBJ","BOSH"]]
>>> print(all_star[0][0])
Kobe
复制代码
  • 例子2,切片的使用
>>> all_star = ['Curry', 'KD', 'Harden','Irving', 'Wall', 'Love']
#索引范围,左侧包含,右侧不包含,当想取前3个元素的话,切片范围为0:3.
>>> all_star[0:3]    
['Curry', 'KD', 'Harden']

 #从第一个元素,取到最后一个元素
>>> all_star[1:]    
['KD', 'Harden', 'Irving', 'Wall', 'Love']

#忽略第一个和最后一个元素
>>> all_star[1:-1]   
['KD', 'Harden', 'Irving', 'Wall']

#从第二个元素开始,每隔一个取一个,2表示步长,默认步长为1.
>>> all_star[1:-1:2] 
['KD', 'Irving']

#在下标为2的位置,从右向左取值,直到最后一个值。
>>> all_star[2::-1]  
['Harden', 'KD', 'Curry']
复制代码

增,append(),insert()

  • 例子:
>>> all_star
['Curry', 'KD', 'Harden', 'Irving', 'Wall', 'Love']
#把元素添加到最后
>>> all_star.append("LBJ")    
>>> all_star
['Curry', 'KD', 'Harden', 'Irving', 'Wall', 'Love', 'LBJ']

#把元素插入到指定位置
>>> all_star.insert(2,"Westbrook")    
>>> all_star
['Curry', 'KD', 'Westbrook', 'Harden', 'Irving', 'Wall', 'Love', 'LBJ']
复制代码

改,采用直接替换的方式

  • 例子:
>>> all_star
['Curry', 'KD', 'Westbrook', 'Harden', 'Irving', 'Wall', 'Love', 'LBJ']
#为需要替换的元素下标赋予新值
>>> all_star[6]="George"    
>>> all_star
['Curry', 'KD', 'Westbrook', 'Harden', 'Irving', 'Wall', 'George', 'LBJ']
复制代码

删,remove()、pop()、del

  • 例子:
#remove()方法直接删除内容
>>> all_star.remove("LBJ")    
>>> all_star
['Curry', 'KD', 'Westbrook', 'Harden', 'Irving', 'Wall', 'George']

 #pop()方法根据索引值删除内容,并返回删除的值
>>> all_star.pop(6)          
'George'
>>> all_star
['Curry', 'KD', 'Westbrook', 'Harden', 'Irving', 'Wall']

#del命令根据索引值删除内容,没有返回
>>> del all_star[5]           
>>> all_star       
['Curry', 'KD', 'Westbrook', 'Harden', 'Irving']

#del命令删除列表对象
>>> del all_star              
>>> all_star      
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'all_star' is not defined
复制代码

一些内置函数:

  • count() 统计元素出现的次数
>>> list1 = [1,2,3,4,5,4,3,2,1,1,0,1]
>>> list1.count(1)
4
复制代码
  • extend() 在列表末尾一次性追加另一个序列中的多个值,有扩展列表的功能。
>>> list1 = [1,2,3] 
>>> list2 = [4,5,6]
>>> list1.extend(list2)
>>> list1
[1, 2, 3, 4, 5, 6]
复制代码
  • index() 获取索引值,当我们知道一个序列的值而不知道期下标是多少,可以使用index函数
>>> list1
[1, 2, 3, 4, 5, 6]
>>> list1.index(4)
3
复制代码
  • reverse() 调转序列顺序
>>> list1 = [1,2,3,4,5,6] 
>>> list1.reverse()
>>> print(list1)
[6, 5, 4, 3, 2, 1]
复制代码
  • sort() 排序
>>> list1 = [1,9,3,7,2,6,0]
>>> list1.sort()
>>> list1
[0, 1, 2, 3, 6, 7, 9]
>>> list1.sort(reverse=True) 
>>> list1
[9, 7, 6, 3, 2, 1, 0]
复制代码
  • len() 获取序列长度
>>> len(list1)
7
复制代码
  • max() 获取序列的最大值
>>> max(list1)
9
复制代码
  • min() 获取元素的最小值
>>> min(list1)
0
复制代码
  • list() 适用于所有类型的序列。字符串不能像列表一样被修改,所以有时根据字符串创建列表会很有用
>>> h = list("hello")
>>> h
['h', 'e', 'l', 'l', 'o']
复制代码
  • join() 可以将一个由字符串组成的列表转换为字符串
>>> ''.join(h)
'hello'
复制代码

元组 Tuple,只读列表

元组使用 () 定义,()中的元素使用逗号隔开。元组也可以通过索引和切片获取元素的值,方法和列表一样。

字典 Dictionary

字典是Python中唯一的映射类型,采用键值对的形式无序存储数据,键不可修改,且唯一;值可以修改。

创建方法:使用 {} 定义字典

>>> dic = {'name':'wt'}
>>> dic=dict((['name','wt'],['a','b'],))
复制代码

对字典的值进行初始化:

>>> all_star = dict.fromkeys(['work','hobby'],'basketball')
>>> print(all_star)
{'work': 'basketball', 'hobby': 'basketball'}
复制代码

字典也支持增删改查

  • 例子
>>> dic1 = {'name':'wt'}
>>> dic1['age'] = 21
>>> dic1
{'name': 'wt', 'age': 21}
复制代码

改:这里介绍3种改的方式

  • 例子
>>> dic1
{'name': 'wt', 'age': 21}
#直接对键进行赋值,有则修改,没有就会创建
>>> dic1['name'] = 'Kobe'       
>>> dic1
{'name': 'Kobe', 'age': 21}

#使用内置的setdefault方法,如果键存在,不改动,返回字典中该键对应的值;如果不存在,增加新的键值对,并返回新增键值对值
>>> dic1.setdefault('age',22)
21
>>> dic1
{'name': 'Kobe', 'age': 21}

#update方法,当dic1字典中有就更新,没有则将dic2字典中的键值对添加到dic1中
>>> dic1 = {'name':'Kobe','age':21}
>>> dic2 = {'name':'TMAC','hobby':'basketball'}
>>> dic1.update(dic2)
>>> dic1
{'name': 'TMAC', 'age': 21, 'hobby': 'basketball'}
复制代码

查:

  • 例子
>>> dic1 = {'name': 'TMAC', 'age': 21, 'hobby': 'basketball'}
#获取指定键的值
>>> dic1['name']
'TMAC'

#通过keys方法获取字典包含的键
>>> dic1.keys()
dict_keys(['name', 'age', 'hobby'])

#通过values()方法获取字典的值
>>> dic1.values()
dict_values(['TMAC', 21, 'basketball'])

#通过items()方法获取字典的所有键值对
>>> dic1.items()
dict_items([('name', 'TMAC'), ('age', 21), ('hobby', 'basketball')])
复制代码

删:

  • 例子
>>> dic1
{'name': 'TMAC', 'age': 21, 'hobby': 'basketball'}
#使用del命令删除指定键的值
>>> del dic1['hobby']
>>> dic1
{'name': 'TMAC', 'age': 21}

#clear()方法清空字典
>>> dic1.clear()
>>> dic1
{}

#pop()方法删除指定键的值,并返回该值
>>> dic1 = {'name':'Kobe','age':21}
>>> dic1.pop('name')
'Kobe'
>>> dic1
{'age': 21}

#popitem()方法随机删除键值对,并返回删除的键值对
>>> dic1 = {'name':'Kobe','age':21}
>>> dic1.popitem()
('age', 21)
复制代码

字典嵌套:字典里可以包含字典、列表等。

books = {
  "日本作家" : {
    "村上春树":["且听风吟","没有女人的男人们","1Q84","多崎作"],
    "井上靖":["敦煌"],
    "东野圭吾":["白夜行","解忧杂货铺","放学后"]
  },
  "欧美作家" : {
    "昆德拉":["庆祝无意义","不能承受生命之轻"],
    "菲茨杰拉德":["了不起的盖茨比"]
  },
  "中国作家" : {
    "路遥":["平凡的世界","人生"],
    "金庸":["天龙八部","射雕英雄传","笑傲江湖"]
  }
}
>>> print(books['日本作家']['村上春树'][1])
没有女人的男人们
复制代码

字典的排序:字典默认根据键排序,列表根据值排序

>>> dic1 = {24:'Kobe',1:'TMAC',30:'Curry',23:'LBJ'}
>>> dic1
{24: 'Kobe', 1: 'TMAC', 30: 'Curry', 23: 'LBJ'}
#字典默认按键排序
>>> print(sorted(dic1.items()))
[(1, 'TMAC'), (23, 'LBJ'), (24, 'Kobe'), (30, 'Curry')]

#按值排序
>>> print(sorted(dic1.values()))
['Curry', 'Kobe', 'LBJ', 'TMAC']
复制代码

使用for循环,打印字典的键值

#打印键
>>> for i in dic1:
...   print(i)
... 
24
1
30
23

#打印键值
>>> for i in dic1:
...   print(i,dic1[i])
... 
24 Kobe
1 TMAC
30 Curry
23 LBJ
复制代码

转载于:https://juejin.im/post/5b723bb36fb9a009c87edb04

相关文章:

  • Discuz!X3.1 全新安装图文教程
  • 关于Solr的使用总结的心得体会
  • paip.语义分析--单字词形容词表180个
  • vue格式化快捷键设置
  • jQuery学习——克隆
  • IBM WebSphere MQ介绍安装以及配置服务详解
  • 思维导图—你不知道的JavaScript中卷
  • C# 类相同属性赋值
  • MVC验证
  • UVa10305 拓扑排序
  • 专科程序员与本科程序员之间有什么区别?
  • HTTP协议
  • 算法一:动态规划
  • Redis学习笔记 - pipline(流水线、管道)
  • nginx模块学习七 http_refer 防盗链
  • 345-反转字符串中的元音字母
  • Angular 4.x 动态创建组件
  • Angular4 模板式表单用法以及验证
  • avalon2.2的VM生成过程
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • create-react-app项目添加less配置
  • ES6 学习笔记(一)let,const和解构赋值
  • go语言学习初探(一)
  • MySQL数据库运维之数据恢复
  • Python爬虫--- 1.3 BS4库的解析器
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 多线程 start 和 run 方法到底有什么区别?
  • 马上搞懂 GeoJSON
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • AI算硅基生命吗,为什么?
  • mysql面试题分组并合并列
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #HarmonyOS:Web组件的使用
  • #单片机(TB6600驱动42步进电机)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (四)linux文件内容查看
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .skip() 和 .only() 的使用
  • @Transactional 竟也能解决分布式事务?
  • [100天算法】-不同路径 III(day 73)
  • [145] 二叉树的后序遍历 js
  • [20160807][系统设计的三次迭代]
  • [22]. 括号生成
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [C++]四种方式求解最大子序列求和问题