元组与列表的区别
元组和列表非常相似。不同之处在于,外观上:列表是被 方括号 包裹起来的,而元组是被 圆括号 包裹起来的。本质上:列表里的元素可修改,元组里的元素是 不可以“增删改” 。
还有一个微妙的地方要注意,就是只有一个元素的元组,在格式上与列表是不同的。仅一个元素 x 的列表写成 [x]
, 但仅一个元素的元组要在括号内多写个逗号:(x,)
。
元组
我们可以把上一关的期中考试成绩用元组的形式记录。原先列表的方括号,改成英文的圆括号就可以:
midterm_rank = (
'妙玉', '薛宝钗', '贾元春', '王熙凤', '林黛玉', '贾巧姐', '史湘云',
'贾迎春', '贾宝玉', '李纨', '贾探春', '秦可卿', '贾惜春', '贾琏'
)
元组和列表非常相似。不同之处在于,外观上:列表是被方括号包裹起来的,而元组是被 圆括号 包裹起来的。本质上:列表里的元素可修改,元组里的元素是 不可以“增删改” 。
还有一个微妙的地方要注意,就是只有一个元素的元组,在格式上与列表是不同的。仅一个元素 x 的列表写成 [x]
, 但仅一个元素的元组要在括号内多写个逗号:(x,)
。
这是因为 Python 中,圆括号承担的语法功能太多了,可以用来表示元组,也可以用于当数学运算中的小括号。(x)
这样的写法,Python 会优先理解成数学运算的小括号,所以光秃秃的 (x)
对 Python 来说就是一个套了个小括号的数学运算表达式。我们来看看代码:
single = (1)
print(type(single))
# 输出:<class 'int'>
可见,上面的 (single)
和 single
一样,都是整数。
对于仅一个元素的元组,我们要特意加个逗号来声明:这是个元组。
single = (1,)
print(type(single))
# 输出:<class 'tuple'>
有了元组这种相对稳定的数据结构,我们就再也不怕手滑把数据改掉啦!
如果真的非要去改元组内部的数据,将会报错的哦:
students = ('林黛玉', '贾宝玉', '薛宝钗')
students.append('史湘云')
# 报错:AttributeError: 'tuple' object has no attribute 'append'
# (属性错误:元组对象没有 append 属性)
# 补充说明:关于“对象”“属性”,我们在后面的课程会说
students[2] = '袭人'
# 报错:TypeError: 'tuple' object does not support item assignment
#(类型错误:元组对象不支持给其中元素赋值)
del students[1]
# 报错:TypeError: 'tuple' object doesn't support item deletion
# (类型错误:元组对象不支持删除操作)
除了上述例子外,其它的用于增加、修改或删除语句和方法都不能用在元组上,同学们可以自己试试~
但是,由于查询与分片操作并不会改变数据,所以我们说的两种列表元素的查询方式以及分片操作,在元组中是可用的。
students = ('林黛玉', '贾宝玉', '薛宝钗')
print(students[1])
# 输出:贾宝玉
print(students.index('贾宝玉'))
# 输出:1
print(students[:2])
# 输出:('林黛玉', '贾宝玉')
另外,上一节所说的列表运算符,元组也都支持。用 in
查询元素是否在元组内;用 +
将两个元组叠加生成新元组;用 *
生成元素重复循环多次的新元组。
students = ('林黛玉', '贾宝玉', '薛宝钗')
daiyu_in = '林黛玉' in students
print(daiyu_in)
# 输出:True
students_plus = students + students
print(students_plus)
# 输出:('林黛玉', '贾宝玉', '薛宝钗', '林黛玉', '贾宝玉', '薛宝钗')
students_triple = students * 3
print(students_triple)
# 输出:('林黛玉', '贾宝玉', '薛宝钗', '林黛玉', '贾宝玉', '薛宝钗', '林黛玉', '贾宝玉', '薛宝钗')
下面,我们总结一下元组支持的操作吧:
有人可能会举手问,如果真的有特殊需求,需要修改元组中的元素怎么办?
在这里有一个思路,可以先用 list()
函数把元组转换成列表,相当于给数据“解锁”,将元素修改完毕后,再用 tuple()
函数转换回元组,相当于“重新上锁”。
我们在下面的代码中来看看具体的操作步骤:
students = ('林黛玉', '贾宝玉', '薛宝钗')
# 用 list() 函数给数据“解锁”,生成一个相同元素的新列表
students_list = list(students)
# 在新列表中修改元素
students_list[0] = '妙玉'
# 再次给数据“上锁”
students = tuple(students_list)
print(students)
# 输出:('妙玉', '贾宝玉', '薛宝钗'
列表和元组的区别,就好比我们四大发明中的 活字印刷 和 石碑 。
两者都可以刻字,
前者的各个字模可以根据需要随意调整,适用于书本、传单等内容变化较多的内容。
石碑是一块完整的石板,一旦刻好就不能再变,适用于要长期保存的重要内容。
我们在实际应用时,也应该根据不同的需求,选择列表或元组。
课后练习
宝玉一直非常佩服黛玉的才情,黛玉写的诗词,他喜欢抄下来一遍一遍读,觉得自己怕是怎么也赶不上了。这不,湘云黛玉又开了诗社,这次是以“柳絮”为题,黛玉便赋了一首《唐多令·咏絮》:
- 粉堕百花州,香残燕子楼。一团团逐对成逑。
- 飘泊亦如人命薄,空缱绻,说风流。
- 草木也知愁,韶华竟白头!叹今生谁舍谁收?
- 嫁与东风春不管。凭尔去,忍淹留。
宝玉见了这首词,欣羡不已,说要永久珍藏,便把这首词录进了元组 willow
中。
willow = (
'粉堕百花州,',
'香残燕子楼。',
'一团团逐对成逑。',
'飘泊亦如人命薄,',
'空缱绻,',
'说风流。',
'草木也知愁,',
'韶华竟百头!',
'叹今生谁舍谁收?',
'嫁与东风春不管。',
'凭尔去,',
'忍淹留。'
)
可是宝玉马虎劲儿又犯了,把“韶华竟白头!”抄成了“韶华竟百头!”……这么好的词,录进元组中还能抄错!
我们赶快帮他补救一下,把这个 willow
中的这个错句改对,并把正确的词完整打印出来吧。
要求:
- 找出错句在
willow
中的位置; - 将
willow
转换成列表,修改错句; - 转换回元组后,打印修改正确后的
willow
。
willow = (
'粉堕百花州,',
'香残燕子楼。',
'一团团逐对成逑。',
'飘泊亦如人命薄,',
'空缱绻,',
'说风流。',
'草木也知愁,',
'韶华竟百头!',
'叹今生谁舍谁收?',
'嫁与东风春不管。',
'凭尔去,',
'忍淹留。'
)
# 查询错误的列
index = willow.index('韶华竟百头!')
# 转成list
willow_list = list(willow)
# 根据下标修改
willow_list[index] = '韶华竟白头!'
# 转回元组
will = tuple(willow_list)
# 打印元祖
print(will)
# 转list
# willow_list = list(willow)
# 找出错句的位置
# wrong_index = willow_list.index('韶华竟百头!')
# 修改
# willow_list[wrong_index] = '韶华竟白头!'
# 转回元组
# will = tuple(willow_list)
# print(will)
学到这里,你应该已经可以熟练地使用列表来辅助自己的教学工作啦。虽然下半学期开始了,尽心尽力的你,还在研究同学们的期中考试成绩。
不过麻烦的是,排名表和分数在不同的列表里,具体排名数字也不直观,还有没有什么办法让我们更系统直观地了解这些数字呢?看来得学一学列表相关的高级操作了。
下一篇:列表的扩展操作