4.2 遍历

遍历是指对整个数据集合的每个元素,都访问一次,并且只访问一次。 例如这是一个列表的遍历:
a=[0]*10
print(a)
for i in range(10):
    a[i]=i
print(a)
整个列表的元素一共有10个:a[0],a[1],a[2],…,a[7],a[8],a[9]。 上面的循环通过下标i的变化(从0变到9),把整个列表遍历了一遍,按下标从小到大的顺序访问列表的元素(a[0],a[1]这样依次访问),并赋值给元素——赋的值是该元素的下标。循环后的结果:a[0]=0,a[1]=1,a[2]=2…a[9]=9。
接下来,我们打印一下整个列表。如果你直接这样写:print(a)那么你可以看到将打印[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。如果用别的格式打印列表,必须使用循环:
a=[0]*10
for i in range(10):
    a[i]=i
    print("a["+str(i)+"]="+str(a[i]))
print(a)
#使用while,每个元素赋予偶数
i=0
while i<10:    
    a[i]=2*i+2
    i=i+1
print(a)
这个循环跟上面的类似,遍历整个列表,然后依次打印。 并且这里要注意一个地方,就是循环条件:i<=9,如果这里没有写好,就很容易造成a[i]的下标越界。例如写成i<=10,那么就会访问到a[10]这个元素,而这个元素不存在,产生越界。
遍历列表可以通过下标来完成,至于下标从小到大,还是从大到小,那就看具体情况和编程的习惯了。我们要掌握如何控制整个遍历的过程。将来我们还会学习到用迭代器来遍历一个集合。
上面遍历的例子,都是已知列表的长度,假如并不能在运行之前就知道列表的长度,该怎么办呢?那么就要使用len函数来算出长度:
a=[0]*10
for i in range(len(a)):
    a[i]=i
    print("a["+str(i)+"]="+str(a[i]))
#使用while,每个元素赋予奇数
i=0
while i<len(a):
    a[i]=2*i+1
    i=i+1
print(a)
上面的代码使用了len(a)代替了之前的10,这种写法更通用,就算不知道a列表的长度,也可以遍历列表。例如打印列表每一个元素:
c=[5,7,8,45,4,7,4,95,478,4,1,2,16,15,58,59,54,54,32]
for i in range(len(c)):
    print("c["+str(i)+"]:"+str(c[i]))

如果上面的c的列表个数,要手动去数的话,那就没有操作性了。有些时候必须使用len。

如果遍历的时候,不需要下标,那么有更简便的遍历方式 :
c=[5,7,8,45,4,7,4,95,478,4,1,2,16,15,58,59,54,54,32]
for i in c:
    print(i)
每次循环i的值直接就是序列c一个元素的值,从下标0开始依次取值。这种遍历没有下标信息。此种遍历必须使用for,while无法在不用下标的情况下遍历列表。下面是一个不痛过过下标查找列表最大值的例子:
c=[5,7,8,45,4,7,4,95,478,4,1,2,16,15,58,59,54,54,32]
max=c[0] #默认第一个值是最大
for k in c:
    print("当前取出",k,",当前最大值",max)
    if k>max:
       print("当前最大值从",max,"替换成",k)
       max=k
      
print(max)

练习题

  • 填空题
    1. (6分) [填空]
    列表arr有        个元素,第一个元素的值是        ,最后一个元素的值是        ,实际上arr的值都是        (奇数、偶数)
    2.完成下面的填空,使得列表arr的每个元素的值都是3 (2分) [编程填空]
    <code><div class='codeNewLine'>arr= [0]*10</div><div class='codeNewLine'><span class='keyword'>for</span> i <span class='keyword'>in</span> <span class='pyFunction'>range</span>(<span class='pyFunction'>len</span>(arr)):</div><div class='codeNewLine'>            </div><div class='codeNewLine'></div></code>
    
  • 编程题
    1.用while也可以遍历 [阅读]
    如代码所示,用while遍历的话,要自己控制i的值
    <code><div class='codeNewLine'>a=[3,4,5,6,7,83,2,56,9]</div><div class='codeNewLine'>i=0</div><div class='codeNewLine'><span class='keyword'>while</span> i<span><</span><span class='pyFunction'>len</span>(a):</div><div class='codeNewLine'>    <span class='pyFunction'>print</span>(a[i])</div><div class='codeNewLine'>    i=i+1</div></code>
    
    2.顺序打印列表k,k=[4,6,5,7,8,23,34,5,6,89] (10分) [编程]
    用while循环的方式打印数组,要求每行打印一个值,形如:
    4
    6
    5
    ……
    3.逆序打印列表k,k=[4,6,5,7,8,23,34,5,6,89] (10分) [编程]
    也就是打印从89那边开始,一直到4。
    提示:i设置为-1,每次减去1,一直到i=-len(k)
    或者i设置为len(k)-1,每次减1,一直到0
    4.定义一个整型列表k1,长度为50,然后把奇数赋值给元素。也就是列表值是1、3、5、7、9...等等。最后使用print(k1)打印列表 (10分) [编程]
    提示:列表定义可使用 k1=[0]*n,n就是列表的元素个数
    5.定义一个整型列表k2,长度为50,然后把偶数赋值给元素。也就是列表值是2、4、6、8、10...等等。最后使用print(k2)打印列表 (10分) [编程]
    6.(*)定义一个列表k3,长度为10,然后把能被7整除的数字赋值给元素。也就是列表是7、14、21、28、35...等等。最后使用print(K3)打印列表 (10分) [编程]
    7.(*)定义一个列表k4,长度为4,然后每个元素的值都从键盘输入。最后使用print打印列表 (10分) [编程]
    提示:输入语句在循环体内,k4每个元素都必须是整数类型(用int函数转换)
    8.(**)定义一个整型列表k5,长度为10,每个元素的值都从键盘输入。然后再输入一个整数m,打印以这个整数为下标的元素的值,如果越界,打印“越界”。 (10分) [编程]
    输入10个数后,列表赋值完毕,再输入一个数字作为下标(一共输入11个数字)
    例如最后输入的是4,就输出k5[m](实际上就是k5[4]),其实就是判断这个数字是不是越界的下标,不是的话打印出来,是的话打印“越界”
    9.定义一个整型列表fibo,长度为10,头两个元素的值是1和2,从第三个元素开始,元素值等于前面两个元素之和。最后打印整个列表。 (10分) [编程]
    开始两个数字是1,2,接下来就是3,5,8,13……这样的数列叫斐波那契数列,n/n+1的值越到后面越接近黄金分割0.618
    提示:先给fibo[0]和fibo[1]赋值,然后i从2开始循环
    10.查找 (10分) [编程]
    已知列表a= [16,23,-3,4,56,6,77,84]
    键盘输入一个数字,赋给变量k,如果k在列表中,那么打印“存在”,否则打印“不存在”。
    提示:这是最简单的一种查找算法,遍历列表,找到就停止。设置一个布尔变量表示存在,初值设为False(默认不存在)。遍历列表,对比每个元素是否和k相等,如果相等,那么这个布尔变量改为True,同时结束循环(break)。最后用if语句判断这个布尔变量是True还是False就知道数是否存在于列表中。

    要知道这样一个逻辑:在循环过程中找到就可以立刻判断存在;但是必须循环整个列表才能判断“不存在”
    11.(*)求两个列表的和 (10分) [编程]
    已知两个列表
    t1=[12,24,35,46,27,38,19,20]
    t2=[5,-9,56,73,66,0,98,299]
    打印两个列表相加的结果,如[17, 15, 91, 119, 93, 38, 117, 319]
    <code><div class='codeNewLine'>t1=[12,24,35,46,27,38,19,20]</div><div class='codeNewLine'>t2=[5,-9,56,73,66,0,98,299]</div></code>
    
    12.求列表里的最大值 (10分) [编程]
    已知列表, a = [16,23,-3,4,56,6,77,84]
    遍历整个列表,然后打印列表的最大值
    提示:定义一个变量max作为最大值,初值是第一个元素的值。然后遍历列表,只要遇到比max更大的元素,就把该值赋给max。循环结束后max就是最大值。
    13.求列表里的最小值 (10分) [编程]
    已知列表,a[] = [16,23,-3,4,56,6,77,84]
    遍历整个列表,然后打印列表的最小值
    14.综合上面两题 (10分) [编程]
    已知列表a,使用一次循环打印出里面的最大值和最小值。
    打印要求:分两行打印,先打印最大值再打印最小值
    提示:定义一个变量max作为最大值,一个变量min
    <code><div class='codeNewLine'> a=[4,-9,56,373,-66,100,-98,299]</div></code>
    
    15.(****)输入下标打印列表 (20分) [编程]
    列表如代码所示。
    要求这样打印列表:输入一个整数k作为下标,如果没有越界,那么打印该元素,如果越界则打印“越界”。重复输入数字,直到所有元素都打印完毕,每个元素只能打印一次,如果已经打印过直接略过什么也不打印。
    提示:
    1.k的输入在循环里,循环次数不能确定,循环条件使用True;
    2.用另外一个列表b来记录是否打印过,这个记录列表b的长度和a一样,所有元素初始值为0。如果下标k打印过,那么列表b下标为k的元素从0修改成1;
    3.再用一个变量表示已经打印过的元素个数,如果这个值等于8说明所有元素都打印过了,break循环

    此题特殊要求:所有缩进仅使用一个空格
    <code><div class='codeNewLine'>a= [16,83,7,4,56,6,77,24]</div></code>