Python列表类型,列举python常见数据类型并举例

  Python列表类型,列举python常见数据类型并举例

  列表是Python中的基本数据类型之一。其他语言也有类似于列表的数据类型。比如js里叫array。它用[]括起来,每个元素用逗号分隔,可以存储各种数据类型。本文将通过实例详细讲解列表的使用方法,有需要的可以参考。

  00-1010 1.常用数据结构列表2。列表的定义和使用2.1列表的操作符2.2列表元素的遍历3。列表的方法3.1添加和删除元素3.2元素的位置和数量3.3元素的排序和反转4。列表5的生成公式。嵌套列表摘要

  

目录

  先给你一个编程任务。掷骰子6000次,计算每个点出现的次数。这个任务对每个人来说应该都很简单。我们可以用1到6个均匀分布的随机数模拟掷骰子,然后用6个变量记录每个点出现的次数。相信大家都能写出下面的代码。

  随机导入

  f1=0

  f2=0

  f3=0

  f4=0

  f5=0

  f6=0

  for _ in范围(6000):

  face=random.randint(1,6)

  如果face==1:

  f1=1

  elif face==2:

  f2=1

  elif face==3:

  f3=1

  elif face==4:

  f4=1

  elif face==5:

  f5=1

  else:

  f6=1

  打印(f1出现{f1}次)

  打印(f2点出现{f2}次)

  打印(f3出现{f3}次)

  打印(多次出现在4点钟位置)

  打印(f5点出现{f5}次)

  打印(f6点出现{f6}次)

  看了上面的代码,相信你一定觉得它非常“笨重”和“难看”。更可怕的是,如果要通过掷出两个或更多的骰子来统计每个点出现的次数,就需要定义更多的变量,编写更多的分支结构。至此,相信大家一定想问:有没有办法用一个变量保存多个数据,有没有办法用一个统一的代码操作多个数据?答案是肯定的。在Python中,我们可以通过容器类型的变量来保存和操作多个数据。首先,我们将引入一个新的数据类型,list。

  

1.常用数据结构之列表

  在Python中,列表是由一系列元素以特定顺序组成的数据序列,这意味着定义一个列表类型的变量,它可以保存多个数据,并允许重复数据。与我们在上一课中讨论的字符串类型一样,列表也是一种结构化的非标量类型。您可以操作列表类型的变量,并且除了操作符之外,还可以使用它的方法。

  在Python中,可以使用[]文字语法来定义列表。列表中的多个元素用逗号分隔,代码如下所示。

  items1=[35,12,99,68,55,87]

  items2=[Python , Java , Go , Kotlin]

  除此之外,你还可以通过Python内置的list函数把其他序列变成列表。准确的说,list不是一个普通的函数,而是一个创建list对象的构造函数(后面会讲到object和constructor的概念)。

  items1=列表(范围(1,10))

  print(items1) # [1,2,3,4,5,6,7,8,9]

  items2=列表( hello )

  print(items2) # [h , e , l , l , o]

  需要注意的是,list是一个可变数据类型,这意味着list可以添加、删除和更新元素,这和我们上节课讲的string有很大的不同。字符串是不可变的数据类型,也就是说,当拼接、重复、转换大小写、修剪空格等时。对一个字符串执行,将生成一个新字符串,而原始字符串没有任何变化。

  >

  

2.1列表的运算符

  和字符串类型一样,列表也支持拼接、重复、成员运算、索引和切片以及比较运算,对此我们不再进行赘述,请大家参考下面的代码。

  

items1 = [35, 12, 99, 68, 55, 87]

  items2 = [45, 8, 29]

  # 列表的拼接

  items3 = items1 + items2

  print(items3) # [35, 12, 99, 68, 55, 87, 45, 8, 29]

  # 列表的重复

  items4 = [hello] * 3

  print(items4) # [hello, hello, hello]

  # 列表的成员运算

  print(100 in items3) # False

  print(hello in items4) # True

  # 获取列表的长度(元素个数)

  size = len(items3)

  print(size) # 9

  # 列表的索引

  print(items3[0], items3[-size]) # 35 35

  items3[-1] = 100

  print(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]

  items6 = list(range(1, 5))

  # 两个列表比较相等性比的是对应索引位置上的元素是否相等

  print(items5 == items6) # True

  items7 = [3, 2, 1]

  # 两个列表比较大小比的是对应索引位置上的元素的大小

  print(items5 <= items7) # True

  

  值得一提的是,由于列表是可变类型,所以通过索引操作既可以获取列表中的元素,也可以更新列表中的元素。对列表做索引操作一样要注意索引越界的问题,对于有N个元素的列表,正向索引的范围是0到N-1,负向索引的范围是-1到-N,如果超出这个范围,将引发IndexError异常,错误信息为:list index out of range。

  

  

2.2列表元素的遍历

  如果想逐个取出列表中的元素,可以使用for循环的,有以下两种做法。

  方法一

  

items = [Python, Java, Go, Kotlin]

  for index in range(len(items)):

   print(items[index])

  

  方法二

  

items = [Python, Java, Go, Kotlin]

  for item in items:

   print(item)

  

  讲到这里,我们可以用列表的知识来重构上面掷色子统计每个点数出现次数的代码。

  

import random

  counters = [0] * 6

  for _ in range(6000):

   face = random.randint(1, 6)

   counters[face - 1] += 1

  for face in range(1, 7):

   print(f{face}点出现了{counters[face - 1]}次)

  

  上面的代码中,我们用counters列表中的六个元素分别表示1到6的点数出现的次数,最开始的时候六个元素的值都是0。接下来用随机数模拟掷色子,如果摇出1点counters[0]的值加1,如果摇出2点counters[1]的值加1,以此类推。大家感受一下,这段代码是不是比之前的代码要简单优雅很多。

  

  

3.列表的方法

  和字符串一样,列表类型的方法也很多,下面为大家讲解比较重要的方法。

  

  

3.1添加和删除元素

  

items = [Python, Java, Go, Kotlin]

  # 使用append方法在列表尾部添加元素

  items.append(Swift)

  print(items) # [Python, Java, Go, Kotlin, Swift]

  # 使用insert方法在列表指定索引位置插入元素

  items.insert(2, SQL)

  print(items) # [Python, Java, SQL, Go, Kotlin, Swift]

  # 删除指定的元素

  items.remove(Java)

  print(items) # [Python, SQL, Go, Kotlin, Swift]

  # 删除指定索引位置的元素

  items.pop(0)

  items.pop(len(items) - 1)

  print(items) # [SQL, Go, Kotlin]

  # 清空列表中的元素

  items.clear()

  print(items) # []

  

  需要提醒大家,在使用remove方法删除元素时,如果要删除的元素并不在列表中,会引发ValueError异常,错误消息是:list.remove(x): x not in list。在使用pop方法删除元素时,如果索引的值超出了范围,会引发IndexError异常,错误消息是:pop index out of range。

  从列表中删除元素其实还有一种方式,就是使用Python中的del关键字后面跟要删除的元素,这种做法跟使用pop方法指定索引删除元素没有实质性的区别,但后者会返回删除的元素,前者在性能上略优(del对应字节码指令是DELETE_SUBSCR,而pop对应的字节码指令是CALL_METHOD和POP_TOP,不理解就跳过,不用管它!!!)。

  

items = [Python, Java, Go, Kotlin]

  del items[1]

  print(items) # [Python, Go, Kotlin]

  

  

  

3.2元素位置和次数

  列表类型的index方法可以查找某个元素在列表中的索引位置;因为列表中允许有重复的元素,所以列表类型提供了count方法来统计一个元素在列表中出现的次数。请看下面的代码。

  

items = [Python, Java, Java, Go, Kotlin, Python]

  # 查找元素的索引位置

  print(items.index(Python)) # 0

  print(items.index(Python, 2)) # 5

  # 注意:虽然列表中有Java,但是从索引为3这个位置开始后面是没有Java的

  print(items.index(Java, 3)) # ValueError: Java is not in list

  

  再来看看下面这段代码。

  

items = [Python, Java, Java, Go, Kotlin, Python]

  # 查找元素出现的次数

  print(items.count(Python)) # 2

  print(items.count(Go)) # 1

  print(items.count(Swfit)) # 0

  

  

  

3.3元素排序和反转

  列表的sort操作可以实现列表元素的排序,而reverse操作可以实现元素的反转,代码如下所示。

  

items = [Python, Java, Go, Kotlin, Python]

  # 排序

  items.sort()

  print(items) # [Go, Java, Kotlin, Python, Python]

  # 反转

  items.reverse()

  print(items) # [Python, Python, Kotlin, Java, Go]

  

  

  

4.列表的生成式

  在Python中,列表还可以通过一种特殊的字面量语法来创建,这种语法叫做生成式。我们给出两段代码,大家可以做一个对比,看看哪一种方式更加简单优雅。

  通过for循环为空列表添加元素。

  

# 创建一个由1到9的数字构成的列表

  items1 = []

  for x in range(1, 10):

   items1.append(x)

  print(items1)

  # 创建一个由hello world中除空格和元音字母外的字符构成的列表

  items2 = []

  for x in hello world:

   if x not in aeiou:

   items2.append(x)

  print(items2)

  # 创建一个由个两个字符串中字符的笛卡尔积构成的列表

  items3 = []

  for x in ABC:

   for y in 12:

   items3.append(x + y)

  print(items3)

  

  通过生成式创建列表。

  

# 创建一个由1到9的数字构成的列表

  items1 = [x for x in range(1, 10)]

  print(items1) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

  # 创建一个由hello world中除空格和元音字母外的字符构成的列表

  items2 = [x for x in hello world if x not in aeiou]

  print(items2) # [h, l, l, w, r, l, d]

  # 创建一个由个两个字符串中字符的笛卡尔积构成的列表

  items3 = [x + y for x in ABC for y in 12]

  print(items3) # [A1, A2, B1, B2, C1, C2]

  

  下面这种方式不仅代码简单优雅,而且性能也优于上面使用for循环和append方法向空列表中追加元素的方式。可以简单跟大家交待下为什么生成式拥有更好的性能,那是因为Python解释器的字节码指令中有专门针对生成式的指令(LIST_APPEND指令);而for循环是通过方法调用(LOAD_METHOD和CALL_METHOD指令)的方式为列表添加元素,方法调用本身就是一个相对耗时的操作。对这一点不理解也没有关系,记住强烈建议用生成式语法来创建列表这个结论就可以了。

  

  

5.嵌套的列表

  Python语言没有限定列表中的元素必须是相同的数据类型,也就是说一个列表中的元素可以任意的数据类型,当然也包括列表。如果列表中的元素又是列表,那么我们可以称之为嵌套的列表。嵌套的列表可以用来表示表格或数学上的矩阵,例如:我们想保存5个学生3门课程的成绩,可以定义一个保存5个元素的列表保存5个学生的信息,而每个列表元素又是3个元素构成的列表,分别代表3门课程的成绩。但是,一定要注意下面的代码是有问题的。

  

scores = [[0] * 3] * 5

  print(scores) # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

  

  看上去我们好像创建了一个5 * 3的嵌套列表,但实际上当我们录入第一个学生的第一门成绩后,你就会发现问题来了,我们看看下面代码的输出。

  

# 嵌套的列表需要多次索引操作才能获取元素

  scores[0][0] = 95

  print(scores)

  # [[95, 0, 0], [95, 0, 0], [95, 0, 0], [95, 0, 0], [95, 0, 0]]

  

  我们不去过多的解释为什么会出现这样的问题,如果想深入研究这个问题,可以通过Python Tutor网站的可视化代码执行功能,看看创建列表时计算机内存中发生了怎样的变化,下面的图就是在这个网站上生成的。建议大家不去纠结这个问题,现阶段只需要记住不能用[[0] * 3] * 5]这种方式来创建嵌套列表就行了。那么创建嵌套列表的正确做法是什么呢,下面的代码会给你答案。

  

scores = [[0] * 3 for _ in range(5)]

  scores[0][0] = 95

  print(scores)

  # [[95, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

  

  

  

总结

  Python中的列表底层是一个可以动态扩容的数组,列表元素在内存中也是连续存储的,所以可以实现随机访问(通过一个有效的索引获取到对应的元素且操作时间与列表元素个数无关)。我们暂时不去触碰这些底层存储细节以及列表每个方法的渐近时间复杂度(执行这个方法耗费的时间跟列表元素个数的关系),等需要的时候再告诉大家。现阶段,大家只需要知道列表是容器,可以保存各种类型的数据,可以通过索引操作列表元素,知道这些就足够了。

  以上就是Python常用数据类型之列表使用详解的详细内容,更多关于Python列表的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: