从零开始的Python计划#a5.1 【列表操作,多维列表】


我!终于!来!更新了!!!这几天一直跟朋友琢磨稿子,导致推迟了几天,再不更新拖延症要犯了hhh!
之前4.1和4.2有讲过列表,使用while循环,for循环,range范围等,这篇会更加仔细得再进行延伸,所以对列表不熟悉的可以先去看第四章哈

1·len函数

使用len()遍历列表
我们可以使用len()函数遍历整个列表,将len的结果提供给range函数
例:

colours=['White', 'Red', 'Blue']
for i in range(len(colours)):
    print(colours[i])

range(len(colours))=range(3),range(3)的范围是0-2,然后最后一句的打印不是一次性的print,在每次i变化的时候,它都会进行print,所以会导致换行的结果。
这里是引用

2·extend方法

extend将列表作为参数并附加所有元素(列表合并列表)

错误示例1:
t1 = ['a', 'b', 'c']
t2 = ['d', 'e']
print(t1.extend(t2))

错误示例2:
t1 = ['a', 'b', 'c']
t1 = t1.sort()
print(t1)

“.”指调用一个方法

大家可能都会觉得这两个print都会返回[‘a’, ‘b’, ‘c’, ‘d’, ‘e’],
事实上并不是这样:
在这里插入图片描述
我们可能会疑惑使用extend不是会得到合并两个列表元素的列表嘛?这是因为:
大多数列表方法都是无效的!它们修改列表并返回None(什么也不返回)
示例1中,extend修改t1,但什么也不返回。sort也是如此。
示例2中,用sort方法去给t1的元素排序,并在t1存储调序结果。因为我们把None存储进t1,如果我们要整理t1的元素,直接调用sort方法,函数t1.sort,不用把它存储在变量里,代码中sort已经调整了t1,根据函数功能已经修改了t1,所以t1 = t1.sort() 要改成t1.sort

所以经过修改,代码应该改成这样,方法才会发挥作用:

示例1
t1 = ['a', 'b', 'c']
t2 = ['d', 'e']
t1.extend(t2)
print(t1)

示例2
t1 = ['c', 'b', 'a']
t1.sort()
print(t1)

打印结果:
['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c']

3·减少Reduce,映射Map,过滤Filter

reduce,map,filter是在讨论列表时的通用概念,它们不是指特定的功能和方法,而是指可以对列表执行的可能事情的通用概念

Reduce

当我们将一系列元素组合成单个值时,可以想到这个概念。

myFullList = [1, 2, 3]
reducedList = sum(myFullList)
print(reducedList)

打印结果:
6

取用列表,通过函数功能,让它减少成为一个值,将许多维度变成一个,称为减少reduce

Map

当我们将函数"映射mapping"到序列的所有元素时,我们可以用"map"定义

"""
def capitalise_all_letters(mySequence): 
    newSequence = []
    for s in mySequence:
        newSequence.append(s.capitalize()) 
    return newSequence
lowCaps = ['h', 'e', 'l', 'l', 'o']
print(capitalise_all_letters(lowCaps))

打印结果:
['H', 'E', 'L', 'L', 'O']

capitalize表示使用大写的方法
把旧的序列中元素变成大写并返回到新的列表中
代码所示例的方法就是mapping,采用大写的方法,把它应用在列表的每个元素上。列表的每个元素被函数修改和存储到另一个地方,所以map就是将新函数映射到序列的每个元素。

Filter过滤

filter可以看作我们只选用一些元素,筛选其它的元素
在这个例子中,只取大写字母

def only_upper(mySequence):
    newSequence = []
    for s in mySequence:
        if s.isupper():
            newSequence.append(s)
    return newSequence

mySentence = 'This is a string, but also a sequence!' 
print(only_upper(mySentence))

打印结果:
['T']

isupper是检查大小写的函数
因为里面唯一的大写字母是T,所以在only_upper函数中的运算结果,返回的新列表中只有大写T。我们把类似于这样的操作称之为过滤。只筛选出大写字母,过滤掉不是大写字母的其它元素。

4·嵌套列表

当我们在另一个列表中有一个列表时,就会产生嵌套列表

例:在这里插入图片描述

嵌套列表中,列表可以包含其他列表作为其中的元素

5·多维列表

一维列表在这里插入图片描述
二维列表的概念可视化
在这里插入图片描述
有横向和纵向

看一下对比,多维列表就是列表不是只走一个方向,可能有第二个方向
Python没有任何默认的数据结构来存储多维序列,但是可以通过列表内部的list来实现。
Python对于多维列表没有特殊的名称,比如元组,列表这些命名所以我们要用嵌入列表(把列表放进另一个列表)来表现多维列表,创造某种网格

在这里插入图片描述

list_2d = [[5,2,3], [8,7,1], [4,6,9]] 

print(list_2d)
打印结果:
[[5, 2, 3], [8, 7, 1], [4, 6, 9]]


如果我想要大列表的第3个列表的第2个数字6(在嵌入列表中索引号为1print(list_2d[2])
打印结果:
[4, 6, 9]
print(list_2d[2][1])
打印结果:
6
可以先用list_2d[2]来选出第三个列表,再用list_2d[2][1]选择第三个列表中的第二个数字6

举一反三:
print(list_2d[0][2])
打印结果:
3

print(list_2d[1][0])
打印结果:
8

再看一个多维列表示例:

def list_2d():
    list2d = []
    #给空列表增加三个空列表:
    list2d.append([]) 
    list2d.append([])
    list2d.append([])
    #我们已经准备好可以包含三个列表的三个插槽,再建立一个二维网格:
    #初始化2d表格,通过for循环来初始化列表
    for row in range(3):
        for col in range(3):
            list2d[row].append(row + col)
    #设定了row的范围,list2d[row]中包含0,1,2,接着横向加上col的列表元素0,1,2
    for row in range(3):
        print(list2d[row])
    #函数里定义的数不能在函数外使用,所以要定义row
list_2d()

[0+0 , 0+1 , 0+2]得出第一个列表[0 , 1 , 2]
再到[1+0 , 1+1 , 1+2]得出列表[1,2,3]
然后再重复,得出列表[2,3,4]
每个单个的row运行一次col,最后打印row的每个元素。因为它是一个二维列表,row的每个元素本身就是一个列表,因此,会打印三个单独的列表。

多维列表会有一点点复杂的感觉,所以大家一定要耐心!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章