1.常用数据结构之列表我们先给大家一个编程任务将一颗色子掷6000次统计每个点数出现的次数。这个任务对大家来说应该是非常简单的我们可以用1到6均匀分布的随机数来模拟掷色子然后用6个变量分别记录每个点数出现的次数相信大家都能写出下面的代码。12345678910111213141516171819202122232425262728importrandomf10f20f30f40f50f60for_inrange(6000):facerandom.randint(1,6)ifface1:f11elifface2:f21elifface3:f31elifface4:f41elifface5:f51else:f61print(f1点出现了{f1}次)print(f2点出现了{f2}次)print(f3点出现了{f3}次)print(f4点出现了{f4}次)print(f5点出现了{f5}次)print(f6点出现了{f6}次)看看上面的代码相信大家一定觉得它非常的“笨重”和“丑陋”更可怕的是如果要统计掷两颗或者更多的色子统计每个点数出现的次数那就需要定义更多的变量写更多的分支结构。讲到这里相信大家一定想问有没有办法用一个变量来保存多个数据有没有办法用统一的代码对多个数据进行操作答案是肯定的在Python中我们可以通过容器类型的变量来保存和操作多个数据我们首先为大家介绍列表list这种新的数据类型。2.定义和使用列表在Python中列表是由一系元素按特定顺序构成的数据序列这样就意味着定义一个列表类型的变量可以保存多个数据而且允许有重复的数据。跟上一课我们讲到的字符串类型一样列表也是一种结构化的、非标量类型操作一个列表类型的变量除了可以使用运算符还可以使用它的方法。在Python中可以使用[]字面量语法来定义列表列表中的多个元素用逗号进行分隔代码如下所示。12items1[35,12,99,68,55,87]items2[Python,Java,Go,Kotlin]除此以外还可以通过Python内置的list函数将其他序列变成列表。准确的说list并不是一个普通的函数它是创建列表对象的构造器后面会讲到对象和构造器这两个概念。1234items1list(range(1,10))print(items1)# [1, 2, 3, 4, 5, 6, 7, 8, 9]items2list(hello)print(items2)# [h, e, l, l, o]需要说明的是列表是一种可变数据类型也就是说列表可以添加元素、删除元素、更新元素这一点跟我们上一课讲到的字符串有着鲜明的差别。字符串是一种不可变数据类型也就是说对字符串做拼接、重复、转换大小写、修剪空格等操作的时候会产生新的字符串原来的字符串并没有发生任何改变。2.1列表的运算符和字符串类型一样列表也支持拼接、重复、成员运算、索引和切片以及比较运算对此我们不再进行赘述请大家参考下面的代码。1234567891011121314151617181920212223242526272829303132333435363738items1[35,12,99,68,55,87]items2[45,8,29]# 列表的拼接items3items1items2print(items3)# [35, 12, 99, 68, 55, 87, 45, 8, 29]# 列表的重复items4[hello]*3print(items4)# [hello, hello, hello]# 列表的成员运算print(100initems3)# Falseprint(helloinitems4)# True# 获取列表的长度(元素个数)sizelen(items3)print(size)# 9# 列表的索引print(items3[0], items3[-size])# 35 35items3[-1]100print(items3[size-1], items3[-1])# 100 100# 列表的切片print(items3[:5])# [35, 12, 99, 68, 55]print(items3[4:])# [55, 87, 45, 8, 100]print(items3[-5:-7:-1])# [55, 68]print(items3[::-2])# [100, 45, 55, 99, 35]# 列表的比较运算items5[1,2,3,4]items6list(range(1,5))# 两个列表比较相等性比的是对应索引位置上的元素是否相等print(items5items6)# Trueitems7[3,2,1]# 两个列表比较大小比的是对应索引位置上的元素的大小print(items5 items7)# True值得一提的是由于列表是可变类型所以通过索引操作既可以获取列表中的元素也可以更新列表中的元素。对列表做索引操作一样要注意索引越界的问题对于有N个元素的列表正向索引的范围是0到N-1负向索引的范围是-1到-N如果超出这个范围将引发IndexError异常错误信息为list index out of range。2.2列表元素的遍历如果想逐个取出列表中的元素可以使用for循环的有以下两种做法。方法一1234items[Python,Java,Go,Kotlin]forindexinrange(len(items)):print(items[index])方法二1234items[Python,Java,Go,Kotlin]foriteminitems:print(item)讲到这里我们可以用列表的知识来重构上面“掷色子统计每个点数出现次数”的代码。12345678importrandomcounters[0]*6for_inrange(6000):facerandom.randint(1,6)counters[face-1]1forfaceinrange(1,7):print(f{face}点出现了{counters[face - 1]}次)上面的代码中我们用counters列表中的六个元素分别表示1到6的点数出现的次数最开始的时候六个元素的值都是0。接下来用随机数模拟掷色子如果摇出1点counters[0]的值加1如果摇出2点counters[1]的值加1以此类推。大家感受一下这段代码是不是比之前的代码要简单优雅很多。