Python学习笔记——列表、元组和字典

Python学习笔记

列表、元组和字典

序列与列表与元组的关系和创建

  • 序列:指的是一种包含多项数据的数据结构,序列包含的多个数据项(也叫成员)按顺序排列,可通过索引来访问成员。

  • Python中常见的序列包括字符串、元组和列表等,另外前面学到过的字节串(bytes)也是序列,以及后面介绍的namedtuple也是序列。

  • 我们介绍的序列主要是列表和元组,他们非常相似,最主要的区别在于:列表是可变的、元组是不可变的。

  • 元组一旦构建出来,程序不能修改元组所包含的元素,就像字符串也是不可变的,程序无法修改字符串所包含的字符序列,但是列表是可变的,程序可以修改列表所包含的元素。

  • 如果只是固定的保存多个数据项,不需要修改他们,此时就应该使用元组;反之就应该使用列表。

  • 列表和元组的关系就是可变不可变。

  • 区分方法:在构建时就可以区分:

    • 方括号是列表、圆括号是元组
    • 列表用list()创建,元组用tuple()创建
  • 创建元组与列表方式一:

    • 创建列表:[ele1,ele2,ele3,...]
    • 创建元组:(ele1,ele2,ele3,...)
    • 注意:由于圆括号在Python中是一个很普通的符号,因此如果创建了只包含一个元素的元组,不能进在圆括号中放一个元素,还必须在元素后放一个逗号,如果不这样,会创建一个普通的字符串、整形变量等。
    • 创建只包含一个元素的元组:(ele1,)
  • 创建元组与列表方式二:

    • 列表用list()创建,元组用tuple()创建
    • 本质:其实listtuple是Python的内置类型,因此list()tuple()其实是他们的构造器。
    • 使用help(list)来查找其作用,会发现它是一个类,使用list来创建列表的方式是:
	_list = list(range(2,10))
	print(_list)
  • 这样的输出结果就是[2, 3, 4, 5, 6, 7, 8, 9],需要注意的是10是不包括的。
  • range()函数简单介绍:有两种用法,第一:写两个至三个元素,分别表示起始,终点,步长,如果写一个元素,就表示总共有几项,且从0开始加。例如:range(4)的结果是0,1,2,3,具体是列表还是元组和前面的其他函数有关。
  • 通过这样的方法,我们也可以实现元组、列表的相互转换list1 = list(my_tuple)

列表和元组的简单使用

  • 通过索引来访问元素

    • 正向访问0,1,2,…反向访问:-1是倒数第一个元素。
    • 这里介绍len()函数,他返回的是列表包含的元素个数。print(len(my_tuple))
    • 如果访问时索引越界,系统会自动帮我们识别并且报错index out of range,也就是说,访问时索引必须在-len() ~ len()-1之间,这样的索引是有效的。
  • 子序列:

    • 前面介绍的字符串操作类似的是:列表和元组同样也可使用索引获取中间一段,这种用法被称为slice(分片或者切片)。
    • 用法:print(my_tuple[2:5])这是从第三个元素取到了第五个元素
    • 或者加上步长: print(my_tuple[2:5:2])
    • 注意中括号是索引固定用法。
  • 序列的加法:

    • 列表和元组支持加法运算,加法的和就是把两个“列表或元组”所包含的元素的总和(注意是前面加后面,后面的列表或元组给到前面的)。
    • 列表只能和列表相加;元组只能和元组相加。如果想让列表和元组相加,可以使用list\tuple函数。
  • 序列的乘法:

    • 列表和元组可以和整数执行乘法,列表和元组乘法的意义就是把他们包含的元素重复N次,N就是被乘的倍数。
    • 可以列表、元素同时进行加法、乘法运算。
  • in运算:

    • 使用方法很简单,就是判定某个元素是否在元组、列表内
    • 例如print(20 in my_list)输出结果就只有TrueFalse,注意如果判断字符串,需要加上单、双引号。
  • 最大值和最小值:

    • python提供了内置的max(),min()全局函数来获取元组或列表的最大值,最小值
    • 由于max(),min()要对元组、列表中的元素比较大小,因此程序要求传给该函数的元组、列表的元素必须是相同类型,且可比较大小。
	a_tuple = (20,10,-2,15.2,102,50)
	b_list = ["crazy","fkit","python","Kotlin"]
	print(max(a_tuple))
	print(min(b_list))
- 这样的结果就分别是:`102`,`Kotlin`

序列封包和序列解包

  • 序列封包:把多个值赋值给一个变量时,Python会自动将多个值封装成一个元组,这种功能被称为序列封包,注意是元组而不是列表,意味着数据不在能被修改
  • 序列解包:序列(元组或列表等)可被直接赋值给多个变量,此时序列的各元素会被依次赋值给每个变量(要求序列的元素个数和变量个数相等),这种功能被称为序列解包。
    • 所有的序列包括range都支持自动解包
    • 例如:a,b,c,d = range(30,34)这样的语句都是合法的
    • 如果只想解包某几个值,剩下的值可以用一个带前置*的变量来接收,但是要注意书写顺序。
    • 由于字符串也是序列,所以字符串也支持解包:a,b,*c = "fkjava.org
    • python的一个特殊语法(多变量同时赋值):a,b,c = val1,val2,val3,这是一个封包和解包的一个比较复杂的过程,结果是a = val1,b = val2,c = val3

列表的用法以及操作列表元素

  • 增加元素:
    • append()方法把传入的参数追加到列表的最后面,链接:这也是c语言中文件操作关键字"a"的由来,这个方法追加另一个列表(序列)时,列表被当成了一个元素,也就是说形成了嵌套。
    • extend()方法就是很普通的用于追加另一个列表(序列),它会将序列(列表)中的元素追加进来。
    • insert()方法将元素插入列表的指定位置,需要多一个参数
	my_list = ["python", "swift"]
	my_list.append(tuple(range(3,6)))
	print(my_list)
  • 输出结果是:['python', 'swift', (3, 4, 5)]
	my_list = ["python", "swift"]
	my_list.extend(range(20,25))
	print(my_list)
  • 输出结果是:['python', 'swift', 20, 21, 22, 23, 24]
	my_list = ["python", "swift"]
	my_list.extend("fkjava")
	print(my_list)
  • 输出结果是:['python', 'swift', 'f', 'k', 'j', 'a', 'v', 'a'],这说明extend方法甚至会拆分字符串
	my_list = ["python", "swift",20,3.4,19,"lancibe"]
	my_list.insert(3, "lus")
	print(my_list)
  • 输出结果是:['python', 'swift', 20, 'lus', 3.4, 19, 'lancibe'],第一个参数就是插入的位置,例如该程序,第一个参数时3,则在第四个位置插入"lus"。注意如果第一个参数越界,会直接在最前/最后面插入。

  • 删除元素:

    • 删除列表元素使用del语句
      • del语句是Python的一种特有的语句,专门用于执行删除操作,不仅可以用于删除列表中的元素,也可用于删除变量等。
      • del语句即可删除列表中的单个元素,也可直接删除列表的中间某一段
      • 使用方法:del my_list [2],这样的语句意思是删除my_list变量中的第3个元素,当然,这也是索引的用法,所以也可以写两至三个变量。
    • 列标提供了remove()方法来删除元素,remove()方法不根据索引删除元素,而是删除第一个找到的元素。
  • 替换元素:

    • 对列表中的元素赋值即可修改列表中的元素。
    • 还可以通过slice语法对列表其中的一部分赋值,对列表的其中一部分赋值时,并不要求新赋值的元素个数与原元素个数相等。这种方式既可为列表增加元素,也可为列表删除元素。
      • 对列表的slice语法赋值时,不能使用单个值;如果使用字符串赋值,Python会自动把字符串当成序列处理。
      • 其实也就是说,去掉哪一部分、换成哪一部分,这就是slice语法的增删替换方法了。
      • 但是一定要注意赋值时不要使用字符串,例如想把第三、四项替换成java,要写:`my_list[2:4] = [“java”]
  • 列表的方法:

    • 通过dir(list)可以查看列表支持的方法,除了以上方法,还可以使用的有以下方法:
    • count():统计列表中某个元素的出现次数
    • index():判断列表中某个元素在列表中的出现位置
    • pop():该方法用于将列表当成“栈”来使用,实现元素出栈的功能。
    • reverse():该方法用于将列表中的元素反向存放
    • sort():该方法用于对列表元素排序

字典入门

字典的意义

  • 字典是用于保存具有映射关系的数据,字典相当于保存了两组数据,其中一组数据时关键数据,被称为key;另一组数据可以通过key来访问,被称为value
  • 字典中的key和value的关联关系如下图所示,key不允许重复。他跟列表不一样。可以通俗理解:例如在一次考试中,语文80分,数学90分,英语70分,假设我们只看分数,80、90、70这三个数字没有任何意义,但是加上了语文、数学、英语这样的keyvalue就有了意义。
    key和value的关系

创建字典

  • 两种方式:
    • 花括号法:花括号应包含多组key-value对,key与value之间用英文冒号隔开;多组key-value对之间用英文逗号隔开。
	score = {"语文":85,"数学":92,"英语":78}
	print(score)
  • 这样就是创建了一个字典,打印结果是:{'语文': 85, '数学': 92, '英语': 78}
  • dict构造器:可以传入多个列表或元组参数作为key-value对;也可为dict指定关键字参数创建字典,此时字典的key不允许使用表达式
	scores = dict([("语文",85),("数学",92),("英语",78)])
	print(scores)
  • 这样的方法也能构造一个字典,要注意在列表里面的每一个元组,都应只有两个元素,且第一个是key,第二个是value,这是默认的、不可改变的。
	scores1 = dict(语文=85,数学=92,英语=78)
	print(scores)
	- 这是dict函数的另一种使用方法。这是用关键字参数创建dict,此时不能用表达式。
  • 字典中的数据都是key:value成对出现。字典的key必须是不可变的,因此列表不能作为dict的key。

字典的访问

  • 通过key来访问value,此时key就是中括号中的值,有点类似于序列的索引。例如:print(score["语文"]),这样的结果就是85。
  • 对已有的key赋值,就会替换该key对应的value。如果对不存在的key赋值,就是添加了新key-value对。例如:score["生物"] = 91,就是增加了一个key-value对。
  • 删除key-value对:
    • 使用del语句删除:del score["数学"]
    • 注意:将制定key赋值为None不能删除key-value对。
  • 使用in/not in可判断dict是否包含指定key
  • 列表和字典都可以进行增、删、改。

dict与列表

  • 字典相当于索引是任意不可变类型的列表;而列表则相当于key只能是整数的字典。如果程序中想要使用的字典的key都是整数类型,则可考虑是不是能换成列表。
  • 列表的索引总是从0开始,连续增大;但字典的索引即使是整数类型,也不需要从0开始,也不需要连续。因此列表不允许对不存在的索引辅助;但是字典则允许这样做——添加一组key-value对。

字典高级用法

  • 字典的常用方法:
    • 调用dir(dict)来查看字典的所有方法
    • clear()用于清空字典中所有key-value对
    • get()方法其实就是根据key来获取value
    • update()方法可使用一个字典所包含的key-value对来更新已有的字典
    • items()、keys()、values()分别用于获取字典中的所有key-value对,所有key,和所有value
	score = {"语文" : 86, "数学":95,"英语":92}
	
	# 用一个字典(字典、序列、关键字参数)来更新原有的字典
	# 对于已有的key,是更新value,对于不存在的key,是增加了key-value,注意如果某些元素,那就保持不变
	score.update({"语文":89,"生物":91})
	
	# 此时序列的每个元素都只能有两个元素
	score.update((("语文",80),("物理",93)))
	print(score)
	
	# 使用关键字参数,不支持用表达式
	score.update(语文=79, 化学=99)
	print(score)
  • 这三条详细的解释了update方法的使用方法。输出结果是{'语文': 80, '数学': 95, '英语': 92, '生物': 91, '物理': 93}
    {'语文': 79, '数学': 95, '英语': 92, '生物': 91, '物理': 93, '化学': 99}
	# 遍历key
	for key in score.keys():
		print(key)
  • 这是遍历了key,输出结果是
	语文
	数学
	英语
	生物
	物理
	化学
  • 使用相似的方法也可以遍历value和key-value对。
	# 遍历key,value(使用到了序列解包)
	for key,value in score.items():
		print(key,value)
  • 这样的输出结果是:
	语文 79
	数学 95
	英语 92
	生物 91
	物理 93
	化学 99
  • pop()方法用于获取、并删除指定key对应的value
  • popitem()方法用于随机的弹出字典中的一个key-value对。
  • setdefauft()方法也用于根据key来获取对应value的值,并为不存在的key设置默认值。print(score.setdefault("语文",50))这样的输出结果是86,但是如果不存在"语文"这一key,则将value的默认值赋为50.
  • fromkeys()方法使用给定的多个key创建字典,这些key的value默认都是None;也可以额外传入一个参数作为默认的value。

用字典格式化字符串

  • 可在字符串模板中按key指定变量,然后通过字典为字符串模板中key设置值
  • 正常情况下使用转换说明符是这样来写的:s1 = "名字是:%s,年龄为:%d再输出语句中写:print(s1 % ("lancibe", 18))
  • 使用字典格式化字符串:
	s2 = "名字是:%(name)s,年龄为:%(age)d"
	print(s2 % {"age" : 18 , "name": "lancibe"})
  • 结果是:名字是:lancibe,年龄为:18两者相同。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lanciberrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值