Python学习笔记(1)之列表list

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'>]

会发现,得到的list2list3的值是一样的,那是否说明这两种方法就是完全一样的呢?答案是否定的。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()delpop(),其中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.小结

本来打算这一篇写列表&元组来着,所以列表都放到一个大标题里了。没到列表写着写着就写了这么一大堆,写的都有点困了,元组就放到下一次写吧。午安。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容