@[枭]
Python第三课
今天讲解了Python的
深浅复制
列表排序与逆序、随机数
列表推导式
①浅复制
概念:浅复制是生成一个新的列表,把原列表的所有引用全复制到新列表中,切片返回的就是浅复制
在浅复制中,如若旧列表中包含有列表,在新列表中该表旧列表中列表元素时,旧列表也会随之改变,如:
>>>aList=[3,5,7]
>>>bList=aList[::]
>>>aList==bList #这里的“==”是询问是否元素一样
True
aList is bList #这里的“is”是询问是否同一对象
False
但如果是:
>>>aList=[3,[5],7]
>>>bList=t=aList[::]
>>>bList[1].append(6) #这里是在索引为1处增加一个6
>>>bList
[3,[5,6],7]
>>>aList
[3,[5,6],7]
综上可以得到,旧列表在浅复制时,不可变类型(如常数)不会受到影响,而可变类型(如列表)会受到影响
②深复制
在使用深复制函数时,需要首先使用
import copy
深复制函数的格式为:
copy.deepcopy()
这里还是使用例子来解释:
>>>aList=[3,[5],7]
>>>bList=copy.deepcopy(aList)
>>>bList[1].append(6)
>>>bList
[3,[5,6],7]
>>>aList
[3,[5],7]
综上可以得到,深复制时不会影响到旧列表
①列表排序
排序包含有升序和降序,其中可以通过key函数来规定排序规则
升序的代码如下:
列表名.sort(reverse=False)
当括号里不填时默认为升序
降序的代码如下:
列表名.sort(reverse=True)
sort函数不是内置函数,在代码之前需要加上import random
关于key来规定列表排序规则,这里用一个例子:
>>>aList=[17,15,13,11,9,7,6,5,4,3]
>>>aList.sort(key=lambda x:len(str(x)))
#lambda是匿名函数,这里代码的意思是通过列表元素转化的字符串长度进行排序
>>>aList
[17,15,13,11,9,7,6,5,4,3]
#长度相同时,通过旧列表的顺序进行排序
用法如下:
>>>aList=[3,4,5,6,7,9,11,13,15,17]
>>>sorted(aList,reverse=True)
[17,15,13,11,9,7,6,5,4,3]
②列表逆序
同sort()函数,reverse()函数不是内置函数,在代码之前需要加上import random
列表逆序,就是列表的首尾不断交换元素,类似于第一排与倒数第一排交换,第二排与倒数第二排交换,以此类推
reverse()函数会影响旧列表
而reversed()为内置函数,不会影响旧列表,且不用加import
但是,reversed是个对象,不能直接访问元素
访问元素需要在前面加list()
比如说:
>>>aList=[3,4,5,6,7,9,11,13,15,17]
>>>newList=reversed(aList)
>>>newList
<Listreverseiterator object at 0x000...>
>>>list(newList)
[17,15,13,11,9,7,6,5,4,3]
③随机数
要使用随机数,需要加上import random
常用的随机数函数有
random.shuffle(列表名) 随机打乱列表的顺序
random.random() 产生0到1之间的随机浮点数
random.randrange(start,end,间隔) 产生间隔为X的随机整数
如果要生成十个随机数,可以这样写
import random
aList=[random.randint(0,100) for i in range(10)]
列表推导式的语法形式为
[exp for variable in iterable in iterable if condition]
e.g.
vec=[[1,2,3],[4,5,6],[7,8,9]]
[num for elem in vec for num in elem]
其中,for elem in vec遍历的是行,及vec[]
for num in elem遍历的是列,及vec[][]