Python基础——list详解

list是什么

Python中的list有点像JAVA中的数组和List对象,但使用上更加灵活好用。

创建一个list对象

可以使用[]里面包含0个或多个元素来创建list,每个元素用,分隔,且里面包含元素可以是不同类型的,甚至可以用list('abc')'abc'.split()将一个字符串转变为一个list,如下:

In [1]: l1 = []   #建立一个空list

In [2]: l2 = ['a','b','c']   #建立一个包含'a','b','c'三个元素的list

In [3]: l3 = list('abcdef')  #将一个字符串转为list

In [4]: l3
Out[4]: ['a', 'b', 'c', 'd', 'e', 'f']

In [5]: l3 = 'abcdef'.split()  #将一个字符串转为list

In [6]: l3
Out[6]: ['a', 'b', 'c', 'd', 'e', 'f']

In [26]: l3 = ['a','b',['c','d'],'e'] # list内可以包含另一个list作为其元素
In [27]: l3
Out[27]: ['a', 'b', ['c', 'd'], 'e']

获取list中的元素

获取list中的元素可以使用list的下标获取

In [44]: l3
Out[44]: ['a', 'b', 'c', 'd', 'e', 'f']

In [45]: l3[0]
Out[45]: 'a'

In [46]: l3[1]
Out[46]: 'b'

In [47]: l3[2]
Out[47]: 'c'

len()函数可以获得list的元素个数

In [44]: l3
Out[44]: ['a', 'b', 'c', 'd', 'e', 'f']

In [48]: len(l3)
Out[48]: 6

当我们取的元素下标超过最后一个元素的下标时,会报IndexError错误

In [44]: l3
Out[44]: ['a', 'b', 'c', 'd', 'e', 'f']

In [49]: l3[6]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-49-b9e71dcfd3ba> in <module>()
----> 1 l3[6]

IndexError: list index out of range

list最后一个元素的下标是len(list)-1
list可以用负整数表示下标,-1表示最后一个元素,-2表示倒数第二个,以此类推。

In [44]: l3
Out[44]: ['a', 'b', 'c', 'd', 'e', 'f']

In [51]: l3[-1]
Out[51]: 'f'

当然负数下标超出list的第一个元素也会引起IndexError错误,list的第一个元素的负数下标为-(len(list))

添加删除元素

list的append()方法可以将一个元素加到list尾部

In [8]: l4 = [1]

In [9]: l4
Out[9]: [1]

In [10]: l4.append(2)

In [11]: l4
Out[11]: [1, 2]

extend()方法可以将另一个list加到当前list的尾部

In [12]: l4.extend([3,4,5])

In [13]: l4
Out[13]: [1, 2, 3, 4, 5]

insert()方法可以将元素插入到list的指定位置

In [18]: l4.insert(2,10)

In [19]: l4
Out[19]: [1, 2, 10, 3, 4, 5]

pop()方法可以将尾部的元素删除,并返回这个元素

In [20]: l4.pop()
Out[20]: 5

In [21]: l4
Out[21]: [1, 2, 10, 3, 4]

remove()方法可以将指定元素移除

In [21]: l4
Out[21]: [1, 2, 10, 3, 4]

In [22]: l4.remove(3)

In [23]: l4
Out[23]: [1, 2, 10, 4]

del函数可以删除指定位置或指定切片(稍后讨论)的元素,甚至删除整个list

In [25]: l4
Out[25]: [1, 2, 10, 4]

In [26]: del l4[2]    #删除位置在2的元素

In [27]: l4
Out[27]: [1, 2, 4]

In [28]: del l4[1:]   #删除位置1及以后的所有元素

In [29]: l4
Out[29]: [1]

In [30]: del l4    #删除整个l4

In [31]: l4   #再调用l4会报错未定义
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-31-f74ac48e0007> in <module>()
----> 1 l4

NameError: name 'l4' is not defined

强大而灵活的切片功能

list利用切片功能可以很方便的取出部分或全部的元素

In [33]: l5
Out[33]: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

In [34]: l5[1:4]
Out[34]: ['b', 'c', 'd']

l5[1:4]切片出的列表包含开始位置1的元素b,但不包含结束位置4的元素。
当然也可以只给出开始位置或只给出结束位置,甚至开始位置和结束位置都不给,只用一个:,表示整个list,如:

In [38]: l5[1:]   #表示位置为1及以后的所有元素
Out[38]: ['b', 'c', 'd', 'e', 'f', 'g']

In [42]: l5[:4] #表示位置4以前的所有元素,注意不包含位置4的元素
Out[42]: ['a', 'b', 'c', 'd']

In [43]: l5[:]  #表示整个l5
Out[43]: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

In [60]: l5[:100]  #切片时下标越界并不会报错,python会自动取范围之内的元素
Out[60]: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

负数下标做切片也是可行的

In [55]: l5
Out[55]: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

In [56]: l5[:-1]
Out[56]: ['a', 'b', 'c', 'd', 'e', 'f']

In [57]: l5[:-0]    #切片要想取最后一个元素结束下标就要大于最后一个元素的下标,或者留空,若用负数是不能表示的,-0就是0,所以-0在这里表示0,与想要的效果相去甚远。
Out[57]: []In [7]: 'Tom' not in user
Out[7]: False

将切片赋值给另一个变量是对原list元素的一种复制操作,改变赋值后的list的元素并不会影响原来的list

In [2]: l5
Out[2]: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

In [3]: l6 = l5[1:3]

In [4]: l6
Out[4]: ['b', 'c']

In [5]: l6[1] = 'z'     #  修改l6中的元素

In [6]: l6
Out[6]: ['b', 'z']   # l6被修改

In [7]: l5
Out[7]: ['a', 'b', 'c', 'd', 'e', 'f', 'g'] #l5未被修改

控制步长,list分片还有第三个参数,可以控制分片的步长,不设置默认为1

In [9]: l7
Out[9]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

In [10]: l7[0:5]
Out[10]: [1, 2, 3, 4, 5]

In [11]: l7[0:5:2]
Out[11]: [1, 3, 5]

分片的步长不能为0(这很好理解),但可以设置为负数,设置为负数时从右向左取元素

In [14]: l7[5:0:-1]
Out[14]: [6, 5, 4, 3, 2]

In [15]: l7[9:3:-2]
Out[15]: [9, 7, 5]

In [16]: l7[::-1]    # 优雅的逆序
Out[16]: [9, 8, 7, 6, 5, 4, 3, 2, 1]

可以对分片进行赋值

In [16]: name
Out[16]: ['p', 'e', 'a', 'r']

In [17]: name = list('Mack')

In [18]: name
Out[18]: ['M', 'a', 'c', 'k']

In [19]: name[3:]= list('aulay')

In [20]: name
Out[20]: ['M', 'a', 'c', 'a', 'u', 'l', 'a', 'y']

分片赋值可以完成list的插入和删除操作

In [21]: n = [1, 10]

In [22]: n[1:] = [2, 3, 4, 5, 6, 7, 8, 9]

In [23]: n
Out[23]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

In [24]: n[1:8] = []

In [25]: n
Out[25]: [1, 9]

list中的+*

两个list可以使用数学运算符+,表示将两个list连接成一个大的list

In [17]: l8 = [1, 2, 3]

In [18]: l9 = [4, 5, 6]

In [19]: l8 + l9
Out[19]: [1, 2, 3, 4, 5, 6]

list可以与一个整数使用运算符*,表示将list重复n次,形成一个大的list(n是*的整数)

In [17]: l8 = [1, 2, 3]

In [21]: l8 * 3
Out[21]: [1, 2, 3, 1, 2, 3, 1, 2, 3]

这个方法在初始化一个list,或是排版打印输出时十分有用

In [24]: l10 = [0]*10

In [25]: l10
Out[25]: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

In [26]: l11 = [None]*10  #使用None作为占位符

In [27]: l11
Out[27]: [None, None, None, None, None, None, None, None, None, None]

下面这个例子摘自《Python基础教程(第2版)》,利用list的*运算很好的解决排版打印问题

sentence = raw_input("Sentence: ")

screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) // 2

print
print ' ' * left_margin + '+'  + '-' * (box_width-4) +  '+'
print ' ' * left_margin + '| ' + ' ' * text_width    + ' |'
print ' ' * left_margin + '| ' +       sentence      + ' |'
print ' ' * left_margin + '| ' + ' ' * text_width    + ' |'
print ' ' * left_margin + '+'  + '-' * (box_width-4) +  '+'
print

#输出结果
Sentence: He's a very naughty boy!

                         +--------------------------+
                         |                          |
                         | He's a very naughty boy! |
                         |                          |
                         +--------------------------+

innot in

python的list可以使用in运算检查某个元素在不在一个list中,存在返回True,不存在返回Falsenot in则反之。

In [5]: user = ['Tom', 'Mack', 'Lee']

In [6]: 'Tom' in user
Out[6]: True

In [7]: 'Tom' not in user
Out[7]: False

list的其他一些方法

count()方法,负责统计list中某个元素出现的次数,此方法返回查找元素出现的次数

In [28]: user = ['Mac', 'Lee', 'Jack', 'Tom', 'Lee']

In [29]: user.count('Lee')
Out[29]: 2

index()方法,找到某个值在list中第一个匹配元素的索引位置,此方法返回第一个匹配元素索引的位置

In [28]: user = ['Mac', 'Lee', 'Jack', 'Tom', 'Lee']

In [30]: user.index('Lee')
Out[30]: 1

reverse()方法,将一个list逆序存放,此方法修改了原来的list,并返回一个迭代器对象

In [31]: n = [1, 2, 3]

In [32]: n.reverse() #reverse方法返回的是一个迭代器对象,并非list对象

In [35]: n
Out[35]: [3, 2, 1]

sort()方法,将list按照一定规则将里面的元素重新排序,此方法修改了原来的list,若想要保留原有的list,则需要先建立list的副本,使用副本调用此方法,此方法没有返回值。当然也可以调用函数sorted(),此函数不改变原list,返回排序好的list

In [36]: n = [100, 102, 99, 87, 1, 2, 56]

In [37]: n.sort()

In [38]: n
Out[38]: [1, 2, 56, 87, 99, 100, 102]

#使用副本调用sort()
In [39]: n = [100, 102, 99, 87, 1, 2, 56]

In [40]: m = n[:]

In [41]: m
Out[41]: [100, 102, 99, 87, 1, 2, 56]

In [42]: m.sort()

In [43]: m
Out[43]: [1, 2, 56, 87, 99, 100, 102]

In [44]: n
Out[44]: [100, 102, 99, 87, 1, 2, 56]

#使用sorted()函数返回排序好的list
In [45]: m2 = sorted(n)

In [46]: m2
Out[46]: [1, 2, 56, 87, 99, 100, 102]

sort()方法包括几个可选参数,cmpkeyreverse
cmp参数可以允许你提供一个比较函数,根据提供的比较函数来进行排序,函数不许遵循一定的规范,例如:compare(x, y),当x < y时,返回负数,当x > y时返回正数,当x == y时返回0

In [44]: n
Out[44]: [100, 102, 99, 87, 1, 2, 56]

#定义compare()函数
In [47]: def compare(x, y):
   ....:     if x < y:
   ....:         return -1
   ....:     elif x > y:
   ....:         return 1
   ....:     elif x == y:
   ....:         return 0


In [48]: n.sort(compare)

In [49]: n
Out[49]: [1, 2, 56, 87, 99, 100, 102]

key参数和cmp参数类似,可以提供一个函数,这个函数为每个元素生成一个键,然后根据元素的键来排序。比如:

In [52]: user.sort(key=len) #根据元素的长度排序

In [53]: user
Out[53]: ['Mac', 'Lee', 'Tom', 'Lee', 'Jack']

reverse参数是一个Boolean类型的参数,当设置为True时,表示反向排序

In [55]: m
Out[55]: [1, 2, 56, 87, 99, 100, 102]

In [56]: m.sort(reverse=True)

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

推荐阅读更多精彩内容