Python内置数据结构之列表List

列表的基本概念和特点

列表(list):是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合,在这种数据结构上进行的基本操作包括对元素的的查找,插入,和删除

  • 一个队列,一个整齐排列的队伍

  • 列表内的个体称作元素,由若干元素组成列表

  • 元素可以是任意对象(数字,字符串,列表,元组等)

  • 列表是线性的数据结构,在内存中连续

  • 使用[]表示

  • 列表是可变的

列表list的定义 初始化

  • list() -> new empty list

  • list(iterable) -> new list initialized from iterable's items

  • 列表不能一开始就定义大小

lst = list()
lst = []
lst = [2,6,9,'ab']
lst = list(range(5))

以上这几种常用的方法都可以定义一个list

列表的索引访问

  • 索引,也叫下标

  • 正索引:从左至右,从0开始,为列表中每一个元素编号

  • 负索引:从右至左,从-1开始

  • 正负索引都不可以超界,否则引发一场IndexError

  • 为了方便理解,可以认为列表是从左至右排列的,左边是头部,右边是尾部,左边是下界,右边是上界

通过索引访问列表

list[index]:index就是索引,使用中括号访问.

  • 索引操作非常简单,时间复杂度为O(1)
lst = list(range(0,100,2))

lst[6]
12

lst[-1]
98

lst[55]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-13-d741eb4099ee> in <module>
----> 1 lst[55]

IndexError: list index out of range


lst[-56]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-14-5e413df323f5> in <module>
----> 1 lst[-56]

IndexError: list index out of range

可见,当输入一个合法的索引时,python能给我们返回一个和索引匹配的值,但是只要索引超界,无论是正索引还是负索引,都会报错IndexError

列表的查询

index方法

  • list.index(value,[start[,stop]])

通过值value,从指定区间寻找列表中的元素是否匹配(当不指定区间时默认搜索整个列表)
匹配到第一个值就停止并返回这个值的索引
匹配不到的话,就报异常ValueError

  • index需要遍历列表,时间复杂度为O(n)

lst = list(range(0,100,2))
lst = list(range(0,100,2))

lst.index(6)
3

lst.index(82,0,48)
41

lst.index(44,-50,-1)
22

lst.index(44,-1,-50)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-923711e149a6> in <module>
----> 1 lst.index(44,-1,-50)

ValueError: 44 is not in list

当我们使用list.index()方法查询列表时,列表中缺少这个value和我们错误地指定区间都有可能导致报错ValueError.
如上面这段代码,指定区间为(-50,-1)时,程序能正常运行,但是当我们改变查找区间为(-1,-50)时,程序报错.在使用负索引指定区间时一定要特别注意区间的方向.

count方法

  • list.count(object)

list.count(object):返回列表中匹配object的次数.

  • count()方法需要遍历列表,时间复杂度为O(n)
lst = list(range(50))

lst.count(2)
1

lst.count(101)
0

当匹配到一个object时,计数器加1.遍历完整个列表,输出匹配到object的次数.一次都没有匹配到时,输出0.

len方法

  • len(obj)

len(obj):返回容器中的项目数.

lst = list(range(5))

len(lst)
50

列表元素的修改

索引访问修改

  • list[index] = value

list[index] = value .修改列表中指定索引下的元素的值

>>> lst = list(range(5))
>>> lst
[0, 1, 2, 3, 4]
>>> lst[0] = 10
>>> lst
[10, 1, 2, 3, 4]
>>> lst[10] = 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

通过指定某个索引可以把这个索引位置修改为我们需要的值.当索引超界时,系统报错IndexError

列表增加,插入元素

  • list.append(object) -> none

list.append(object):在列表尾部增加元素

>>> lst = [1,2,3,4,5]
>>> lst.append(12)
>>> lst
[1, 2, 3, 4, 5, 12]

list.append()方法只能在列表尾部增加,时间复杂度O(1)
返回None意味着没有新的列表产生,就地修改

  • list.insert()

list.insert(index,object) -> None:在指定的索引Index处插入元素object
返回None意味着没有新的列表产生,就地修改
时间复杂度O(n)

>>> lst = [1,2,3,4,5]   #定义一个新列表
>>> lst.insert(1,10)     #在索引1处插入10
>>> lst
[1, 10, 2, 3, 4, 5]
>>> lst.insert(-1,1)      #在索引-1处插入1
>>> lst
[1, 10, 2, 3, 4, 1, 5]
>>> lst.insert(100,666)   #在索引100处插入666
>>> lst
[1, 10, 2, 3, 4, 1, 5, 666]
>>> lst.insert(-100,666)    #在索引-100处,插入666
>>> lst
[666, 1, 10, 2, 3, 4, 1, 5, 666]

可见,当正索引超界时,在尾部追加.负索引超界时,在头部追加.

  • list.extend()

list.extend(iterable) -> None:
将可迭代元素的对象追加进来,返回None
就地修改

>>> lst = [1,1,1]
>>> lst.extend(range(5))
>>> lst
[1, 1, 1, 0, 1, 2, 3, 4]
  • list1 + list2

list1 + list2 -> list:
连接操作,将两个列表连接起来
产生新的列表
本质上是调用的add()方法

>>> lst1 = [2,2,2]
>>> lst2 = [1,1,1]
>>> lst1 + lst2
[2, 2, 2, 1, 1, 1]
  • list * Integer

list * Integer -> list:
重复操作,将本列表元素重复n次,返回新的列表

>>> lst = [1,2,3]
>>> lst * 3
# 和正整数相乘
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> lst * 0
# 和0相乘
[]
>>> lst = [1,2,3]
>>> lst * (-1)
# 和负整数相乘
[]
>>> lst * 3.0
# 和浮点数相乘
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'

当列表和浮点数相乘时,系统报错TypeError,不能和非整数做该运算.
当列表和非正整数(包括0和负数)相乘时,得到的新列表为[]列表(空列表).

列表删除元素

  • remove()

list.remove(value) -> None:
从左至右查找第一个匹配value的值,移除该元素
就地修改

>>> lst = [1,3,5,7,9]
>>> lst.remove(5)
>>> lst
[1, 3, 7, 9]
>>> lst.remove(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

当输入的value在list中无法找到时,程序报错ValueError.
remove方法是先遍历,找到匹配的value值后再删除,效率较低.

  • list.pop()

list.pop([index]) -> item:
不指定索引index,就从列表尾部弹出一个元素,返回该元素.
指定索引index,就从索引处弹出一个元素,索引超界时报错IndexError

>>> lst = [1,2,3,4,5,6,7]
>>> lst.pop(0)
1
>>> lst.pop()
7
>>> lst
[2, 3, 4, 5, 6]

pop方法默认使用从末尾弹出时时间复杂度为O(1),效率很高.
当我们使用pop方法对列表进行操作时,返回的时弹出的元素的值而不是修改后的列表.

  • list.clear()

list.clear() -> None:
清除列表所有元素,剩下一个空列表

>>> lst = [1,2,3,4,5]
>>> lst.clear()
>>> lst
[]

列表其他操作

  • list.reverse()

list.reverse() -> None:
将列表元素反转,返回None
就地修改

>>>lst = [1,2,3,4,5]
>>>lst.reverse()
>>>lst
[5,4,3,2,1]

reverse方法效率不高,尤其是在数据量较大时.

  • list.sort()

sort(key=None,reverse=False) -> None:
对列表元素进行排序,就地修改,默认升序
reverse为True,则反转列表,变为降序
key一个函数,指定key如何排序

>>> lst
[5, 4, 3, 2, 1]
>>> lst = [3,9,5,1,5,6,23,54,88,2,1]
>>> lst.sort()
>>> lst
[1, 1, 2, 3, 5, 5, 6, 9, 23, 54, 88]
>>> lst.sort(reverse=True)
>>> lst
[88, 54, 23, 9, 6, 5, 5, 3, 2, 1, 1]

sort方法默认升序,reverse=True时变为降序

>>> lst = [3,9,5,1,5,6,23,3.5,2.7,44.0]
>>> lst.sort()
>>> lst
[1, 2.7, 3, 3.5, 5, 5, 6, 9, 23, 44.0]

当出现浮点数时,sort方法可以正确的和整型比较大小.

>>> lst = [3,9,5,1,5,'3','a',0]
>>> lst.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'

报错TypeError,<这个比较运算符不支持在str类型和int类型之间使用.我们甚至还可以看到sort的排序方法是使用了比较运算符的

>>> lst = [3,9,5,1,5,'3','a',0]
>>> lst.sort(key=str)
>>> lst
[0, 1, 3, '3', 5, 5, 9, 'a']

这个时候给key传递一个str参数,在进行sort排序时默认使用函数str对列表内的元素进行处理
则成功排序,修改生成了一个排序后的list

  • object in list

object in list:
判断一个对象是否存在于这个元素中,返回bool值

>>> lst = [1,2,[3,4],5,6]
>>> 2 in lst
True
>>> 10 in lst
False
>>> 3 in lst
False
>>> [3,4] in lst
True

当元素存在于这个列表中时,返回True,否则返回False.
值得注意的是,即使某个元素存在于列表中某个容器元素中而不是直接作为列表的子元素,in操作只能返回False.



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

推荐阅读更多精彩内容