美文网首页程序员简书面面观
Python Learning-列表的更多操作

Python Learning-列表的更多操作

作者: 东南有大树 | 来源:发表于2018-08-22 12:29 被阅读113次

    遍历列表-for循环

    列表中存储的元素可能非常多,如果想一个一个的访问列表中的元素,可能是一件十分头疼的事。那有没有什么好的办法呢?当然有!使用for循环

    假如有一个食物名单列表,通过for循环将列表中的食物名称都打印出来

    # 定义一个食物名单列表
    foods = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    # 循环访问foods列表
    for food in foods:
        print(food)
    

    输出:

    potato
    tomato
    noodles
    apple
    pizza

    for循环将foods列表中的元素依次输出了出来

    for food in foods:这行代码表示将foods列表中的元素依次取出,每次次元素的值赋给变量food;本句代码最后以冒号结尾

    print(food)本行代码之前有四个字符的缩进,表示这行代码属于for food in foods:的代码块

    for循环每次从列表中取出一个元素后,都会进入代码块中执行一遍,即输出元素的名称;直到将列表所有的元素都遍历一次后,循环停止

    # 定义一个食物名单列表
    foods = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    # 循环访问foods列表
    for food in foods:
        print(food)
        
    # 循环之外的代码
    print('循环已经完毕')
    

    print('循环已经完毕')的前面没有缩进,说明它不属于for循环块中的代码;所以,当for循环完毕后,会接着执行下面的这句代码

    输出:

    potato
    tomato
    noodles
    apple
    pizza
    循环已经完毕

    其中,变量food是一个临时变量,可以随意取名称;不过建议取有意义的名称,在这里用foods表示食物列表,用food表示列表中的食物,方便理解

    循环也可以嵌套使用

    假如小明喜欢一些食物,这些食物名称被存储到foods1列表中;小红喜欢另一些食物,这些食物名称被存储到foods2中;现在想知道小明与小红所喜欢的食物是否有相同的,则可用如下方式:

    # 小明喜欢的食物列表 
    foods1 = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    # 小红喜欢的食物列表
    foods2 = ['chocolate', 'pizza', 'maize', 'watermelon']
    
    # 通嵌套循环寻找出两个列表中相同的食物名称
    for food1 in foods1:
        for food2 in foods2:
            if food1 == food2:
                print('小明和小红共同喜欢的食物是', food1)
                
    

    输出:

    小明和小红共同喜欢的食物是 pizza

    for food2 in foods2:前面有缩进,说明它是for food1 in foods1:块中的代码;第一外循环从小明喜欢的食物列表中依次取出食物名称,然后进行自身的代码块中;第二行代码依次遍历小红喜欢的食物列表,然后进行循环体(代码块),然后判断foods1中的第一个元素与foods2中的第一个元素是否一样,foods1中的第一个元素与foods2中的第二个元素是否一样,……,foods1中的第一个元素与foods2中的第四个元素是否一样,如果一样,则执行打印print('小明和小红共同喜欢的食物是', food1);接着判断foods1中的第二个元素与foods2中的第1个元素是否一样,……,foods1中的第二个元素与foods2中的第四个元素是否一样,如果一样,则执行打印print('小明和小红共同喜欢的食物是', food1)……直到判断到foods1中的第五与foods2的所有元素比较一次后,嵌套循环执行完毕

    注:if表示判断一个结果,如果结果是真,则执行代码块,如果不是真,则跳过代码块;==表示判断两个值是否相等,如果相等返回真,如果不相等返回假。这两个知识点将在后面进行详细探讨

    在写for循环语句的时候,造成别忘记在后面加上冒号,循环体中的代码千万别忘记添加缩进;缩进一般是一个制表符的距离,即四个空格的距离;不过,不建议将制表符与空格符混合使用

    创建数值列表-range()

    前面的列表中的元素都是字符串类型的,列表中可以存储任意对象,现在定义一个数值列表

    numbers = [1,2,3,4,5]
    

    如果想定义一个从1到1000的数值列表,手动将这些数值一个一个写进列表里,一点也不高效;可以使用函数range()快速创建一系列数字

    for value in range(1,6):
        print(value)
    

    输出:

    1
    2
    3
    4
    5

    rnage(1, 6)会生成从1到5的数字,6表示到6的时候就停止创建动作,如果想创建1到1000的数字,则是range(1, 1001)

    通过list()可以将range()创建的数字转换成列表

    # 输出range()看看
    numbers = range(1,6)
    print('range: ',numbers)
    
    # 转换成列表后,再输出看看
    numbers = list(numbers)
    print('list: ',numbers)
    

    输出:

    range: range(1, 6)
    list: [1, 2, 3, 4, 5]

    可以看出,range()返回的是一个可迭代对象,经过转换后才是一个列表对象

    还可以通过指定步长,来生成一系列偶数

    numbers = range(2,21,2)
    print(list(numbers))
    

    输出:

    [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

    range(start, stop[, step])这是Python的使用说明文档中关于range()的使用说明,start表示从哪个数字开始,stop表示到哪个数字停止,[, step]表示步长,方括号表示这个参数是可选的,即可写可不写

    可以在Python的IDLE中输入help(range)来得到关于range()的帮助文档

    >>> help(range)
    

    一些简单的、常用的数字列表统计函数:

    # 定义一个偶数列表
    numbers = list(range(2,21,2))
    
    # 求数值列表中最小的元素值
    print(min(numbers))
    # 求数值列表中最大的元素值
    print(max(numbers))
    # 求数值列表所有元素的和
    print(sum(numbers))
    

    输出:

    2
    20
    110

    列表解析

    直接看下面代码

    # 定义一个偶数列表
    numbers = list(range(2,21,2))
    
    squares = [value**2 for value in numbers]
    print(squares)
    

    输出:

    [4, 16, 36, 64, 100, 144, 196, 256, 324, 400]

    for循环的这种写法squares = [value**2 for value in numbers]叫做列表解析

    首先,写一对中括号,它表示一个列表;然后列表中分类两部分,第一个部分是表达式,即value**2,这个表达的意思是计算一个值的乘方;第二部分是列表循环,即for value in numbers;最终结果是将列表中的每个值都按乘方计算一次后,放入一个列表中,再赋值给变量squares

    这里需要注意的是,循环后面没有冒号,可以理解为将循环体的代码块精简成了一个表达式

    列表切片

    只获取列表的部分元素,这样的操作叫作切片

    切片通过列表的索引进行操作,即从哪个索引开始,到哪个索引结果,将这段元素取出

    # 定义一个食物列表
    foods = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    
    # 取出第二个元素到第四个元素
    print(foods[1:4])
    

    输出:

    ['tomato', 'noodles', 'apple']

    foods[1:4]方括号中的1表示索引1位置,4表示索引4位置;需要注意的是,1表示从索引1开始,而4表示到索引4就结束;也就说,索引4位置的元素不会返回;所以,这里返回的结果是从索引1到索引3的三个元素

    如果省略冒号前的数字,则表示从开始的位置取值

    # 从索引0开始,取到索引4之前的所有值
    foods[:4]
    

    如果省略冒号后的数字,则表示一直取到列表的末尾

    # 从索引1开始,一下取到列表结束的位置
    foods[1:]
    

    如果只有冒号,表示取所有数据

    # 取所有数据
    foods[:]
    

    还可能使用负数

    # 从倒数3个元素开始,一直取到末尾
    foods[-3:]
    

    for循环与切片的结合

    # 定义一个食物列表
    foods = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    
    # 打印第2个到第4个元素
    for food in foods[1:4]:
        print(food)
    

    输出:

    tomato
    noodles
    apple

    关于列表的复制

    先来看个例子

    foods1 = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    foods2 = foods1
    print(foods1)
    print(foods2)
    

    将foods1列表赋值给foods2列表,看似是一个复制动作,但foods1与foods2实际上是一个对象

    foods1 = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    foods2 = foods1
    foods1.append('chocolate')
    print(foods1)
    print(foods2)
    

    输出结果:

    ['potato', 'tomato', 'noodles', 'apple', 'pizza', 'chocolate']
    ['potato', 'tomato', 'noodles', 'apple', 'pizza', 'chocolate']

    因为,['potato', 'tomato', 'noodles', 'apple', 'pizza']创建了一个列表对象,foods1变量与foods2变量实际存储的是指向['potato', 'tomato', 'noodles', 'apple', 'pizza']的一个引用,所以,修改foods1后,发现food2也变了

    复制需要另外创建出一个一模一样的对象出来,但它们必须的确是两个对象才行

    foods1 = ['potato', 'tomato', 'noodles', 'apple', 'pizza']
    foods2 = foods1[:]
    foods1.append('chocolate')
    print(foods1)
    print(foods2)
    

    输出:

    ['potato', 'tomato', 'noodles', 'apple', 'pizza', 'chocolate']
    ['potato', 'tomato', 'noodles', 'apple', 'pizza']

    foods1[:]返回foods1所有的元素,并创建了一个副本,这个副本是另一个对象,然后再会给了foods2,因此在更改foods1时,没有影响到副本

    也可以使用id(foods1);id(foods2)来查看列表对象在计算机内的ID,ID不同,则不是同一个对象

    简单谈一下元组

    元组的使用与列表类似,不同的,列表是可改变的,而元组不是可改变的;列表用[]来定义,元组则使用()来定义

    # 定义一个元组
    numbers = (1,2,3,4,5)
    
    # 支持索引访问
    print(numbers[1])
    # 支持循环
    for number in numbers:
        print(number)
        
    # 不支持对元素的修改,执行下面代码会报错
    numbers[0] = 11
    

    报错内容

    Traceback (most recent call last):
    File "C:/Users/Administrator/Desktop/s.py", line 11, in <module>
    numbers[0] = 11
    TypeError: 'tuple' object does not support item assignment

    目录
    上一章 Python Learning-列表
    下一章 Python Learning-条件控制语句

    相关文章

      网友评论

        本文标题:Python Learning-列表的更多操作

        本文链接:https://www.haomeiwen.com/subject/cpgeiftx.html