0.写在前面
首先感谢大家在上一篇文章中点的小心心,尤其感谢陈老板和闫老板的打赏!我想在说一下这只是一些随笔的内容,写这个系列的主要原因是我在学习的过程中发现有些东西太多太难记了,第二天就忘得差不多(可能是我太笨了QAQ),所以想趁热打铁的记录下来方便日后查询。各位千万别当教程看,我不太注重条理一般都是想到哪写到哪。想系统学的话推荐鱼C论坛,有挺多资源可以利用也有教学视频。最后感谢大家的鼓励和支持!
1.列表——一个万能的集装箱
在MATLAB里,无论是向量还是矩阵等等它们中的元素类型必须是相同的,而Python的列表则没有这些限制,它能把整数、浮点数、字符串、对象甚至是列表或者元组这些完全不同的东西放到一起形成一个列表。
1.1创建列表
创建一个列表只需将元素用中括号[ ]
括起来,各元素之间用逗号分割。
number = [1 , 2 , 3 , 4 , 5] #这是一个数组
mix = [1 , '嘻嘻嘻' , [1,2,3] , int] #这是一个混合列表
empty = [] #这是一个空列表
>>> print(mix)
[1, '嘻嘻嘻', [1,2,3], <class 'int'>]
>>> type(empty)
<class 'list'>
列表推导式
格式为[有关A的表达式 for A in B]
。
>>> [i**2 for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1.2向列表添加元素
可选函数append()
、extend()
、insert()
,注意它们都是属于list
这个"类(class)"的"方法(method)",因此调用时应该采用object.method()
的形式。关于“对象”和“类”在以后的文章中再详细地说明,现在可以先通过例子简单理解其用法。
append()
向列表的最后添加一个元素,函数只有一个参数,即要添加的元素。若输入参数过多会报错。
>>> mix2 = [3.14 , '嘻嘻嘻' , [1,2,3] ] #这是一个混合列表
>>> mix2.append('你真帅!')
>>> print(mix2)
[3.14, '嘻嘻嘻', [1, 2, 3], '你真帅!']
#尝试添加多个元素
>>> mix2.append('你真帅!' , '你好美!')
Traceback (most recent call last):
File "<pyshell#82>", line 1, in <module>
mix2.append('你真帅!' , '你好美!')
TypeError: append() takes exactly one argument (2 given)
在上面的例子可以看出,append的用法是 “待添加列表.append(element)”,其中待添加列表就是对象。
extend()
要是想一次添加多个元素怎么办?可以通过extend()
函数来实现。只需将欲添加的元素放在一个列表里作为extend的参数即可,Python会将列表中的元素依次添加到列表最后。
>>> mix2 = [3.14 , '嘻嘻嘻' , [1,2,3] ] #这是一个混合列表
>>> mix2.extend(['你真帅!' , '你好美!'])
>>> print(mix2)
[3.14, '嘻嘻嘻', [1, 2, 3], '你真帅!', '你好美!']
insert()
insert()
可以将元素插入列表中间,它需要输入两个参数,依i次是待索引值(index)和添加元素。
>>> mix2 = [3.14 , '嘻嘻嘻' , [1,2,3] ] #这是一个混合列表
>>> mix2.insert( 2 , '你真帅!')
>>> print(mix2)
[3.14, '嘻嘻嘻', '你真帅!', [1, 2, 3]]
注意!Python的索引值是从0开始的!
append()和extend()的一个比较
>>> mix2 = [3.14 , '嘻嘻嘻' , [1,2,3] ] #这是一个混合列表
>>> mix3 = mix2[:]
>>> mix2.append(['你真帅!' , '你好美!'])
>>> mix3.extend(['你真帅!' , '你好美!'])
>>> print(mix2)
[3.14, '嘻嘻嘻', [1, 2, 3], ['你真帅!', '你好美!']]
>>> print(mix3)
[3.14, '嘻嘻嘻', [1, 2, 3], '你真帅!', '你好美!']
append会将[x,y]
视为一个元素,元素类型为列表;而extend则将其视为两个元素。
1.3从列表中获取元素
最简单的就是通过索引值来获取,尤其注意索引值从0开始!索引值-1代表最后一个元素。
>>> mix = [3.14 , '嘻嘻嘻' , [1,2,3] , int , range(5) ] #这是一个混合列表
>>> mix[0]
3.14
>>> mix[3]
<class 'int'>
>>> mix[-1] #索引值-1代表最后一个元素
range(0, 5)
列表切片(slice)
只需要用[start:stop]
的方式即可。start默认值为0,stop默认值为-1。并且和之前一样,取出的元素是不包括stop对应的元素的。
>>> mix[1:3]
['嘻嘻嘻', [1, 2, 3]]
>>> mix[2:]
[[1, 2, 3], <class 'int'>, range(0, 5)]
>>> mix[:]
[3.14, '嘻嘻嘻', [1, 2, 3], <class 'int'>, range(0, 5)]
copy变量时容易犯得一个错误(划重点)
观察下面的两种方法。
1 >>> list1 = [ 1 , '嘻嘻嘻' , int ] #这是一个列表
2
3 >>> list2 = list1
4 >>> list3 = list1[:]
5
6 >>> print(list2)
7 [1, '嘻嘻嘻', <class 'int'>]
8 >>> print(list3)
9 [1, '嘻嘻嘻', <class 'int'>]
会发现,得到的list2
和list3
的值是一样的,那是否说明这两种方法就是完全一样的呢?答案是否定的。Python对变量的储存机制是一种"贴标签"的模式,不是把值赋给变量,而是把变量名贴到值上。通俗的讲,python中储存的是一个个不同类型的数据,每个数据上都可能有一个或几个变量名或者一个都没有。一个数据上的不同的变量名指向的是同一个数据。因此上面第三行只是又给list1
的值贴了个新标签,而第四行才是真正的copy了一个新变量。我们做一个实验:
>>> list2.append('给list2添加一个元素')
>>> print(list1)
[1, '嘻嘻嘻', <class 'int'>, '给list2添加一个元素']
我们会发现给list2
添加一个元素后,相应的list1
也随之变化了。
>>> list3.append('猜猜看会怎样') #给list3添加一个元素
>>> print(list1)
[1, '嘻嘻嘻', <class 'int'>, '给list2添加一个元素']
>>> print(list3)
[1, '嘻嘻嘻', <class 'int'>, '猜猜看会怎样']
可见list3
对变化对list1
毫无影响,很神奇有木有?!画个草图的大概是这样???
真丑(捂脸)
Python还有回收机制,对于没有标签的数据会自动回收,所以就不用担心它们占用内存咯。
1.4从列表中删除元素
可选函数有remove()
、del
、pop()
,其中remove和pop是属于list
的方法,应用时调用object.remove()
或object.pop()
即可,del相对特殊些下面再说。
remove()
remove()只有一个输入参数,即要删除的元素的名称,它没有返回值。remove每次只能删除一个元素,并且不需要知道元素的索引值。
>>> mix = [1 , '嘻嘻嘻' , [1,2,3] , int]
>>> mix.remove(int)
>>> print(mix)
[1, '嘻嘻嘻', [1, 2, 3]]
小技巧:如果只知道索引值,该如何运用remove()
?
>>> mix = [1 , '嘻嘻嘻' , [1,2,3] , int]
>>> mix.remove( mix[1] )
>>> print(mix)
[1, [1, 2, 3], <class 'int'>]
pop()
pop()的输入参数是要删除元素的索引值,缺省时为-1,即删除最后一个元素。并且pop有返回值,它返回要删除的元素。
>>> mix = [1 , '嘻嘻嘻' , [1,2,3] , int]
>>> delete = mix.pop(3)
>>> print(mix)
[1, '嘻嘻嘻', [1, 2, 3]]
>>> print(delete)
<class 'int'>
del
del用于删除列表中的元素时的用法为del object[index]
。
>>> mix = [1 , '嘻嘻嘻' , [1,2,3] , int]
>>> del mix[3]
>>> print(mix)
[1, '嘻嘻嘻', [1, 2, 3]]
del也可以用来删除整个变量,但是应注意del删除的是标签(变量名)而不是值。例如
>>> mix1 = mix2 = [1 , '嘻嘻嘻' , [1,2,3] , int]
>>> del mix1
>>> print(mix2)
[1, '嘻嘻嘻', [1, 2, 3], <class 'int'>]
>>> print(mix1)
Traceback (most recent call last):
File "<pyshell#44>", line 1, in <module>
print(mix1)
NameError: name 'mix1' is not defined
1.5 两个列表比较大小
比较方法为:从第一个元素顺序开始比较,如果相等,则继续。返回第一个不相等元素比较的结果,如果所有元素比较均相等,则长的列表大,一样长则两列表相等。
>>> list1 = [1 , 2 , 3]
>>> list2 = [2 , 3 , 4]
>>> list3 = [1 , 2 , 3 , 4]
>>> list1 < list2
True
>>> list2 > list3
True
>>> list1 < list3
True
字符串之间也可以进行比较,比较相应的ASCII码的大小,具体的可以参见比较操作符的用法。
1.6 列表中的操作符
+
和*
可用于列表的拼接
>>> list1 = [1 , 2 , 3]
>>> list2 = [2 , 3 , 4]
>>> list3 = list1 + list2
>>> print(list3)
[1, 2, 3, 2, 3, 4]
>>> list1 = [1 , 2 , 3]
>>> list1 *= 3
>>> print(list1)
[1, 2, 3, 1, 2, 3, 1, 2, 3]
in
可用于判断某一元素是否位于列表中
>>> list1 = [1 , 2 , 3]
>>> 1 in list1
True
>>> 5 in list1
False
>>> 5 not in list1
True
1.7 列表的其他BIF
列表还有许多其他的内置函数,可以通过dir(list)
进行查看。
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
举个例子,sort()
函数可用于列表的排序,默认从小到大排序。
>>> list0 = [1 , 3 , 2 , 5]
>>> list0.sort()
>>> print(list0)
[1, 2, 3, 5]
>>> list0.sort(reverse = True) #从大到小排列
>>> print(list0)
[5, 3, 2, 1]
reverse()
可将列表倒序排列
>>> list0 = [1 , 3 , 2 , 5]
>>> list0.sort()
>>> print(list0)
[5, 2, 3, 1]
其他BIF可以通过help(list.func)
的方法查询其用法。
2.小结
本来打算这一篇写列表&元组来着,所以列表都放到一个大标题里了。没到列表写着写着就写了这么一大堆,写的都有点困了,元组就放到下一次写吧。午安。