列表 []


一、关于列表

列表对象的本质是一个有序的、可迭代、可切片、可变的序列,内部元素支持任意对象。

是写在方括号 [] 之间、用逗号分隔开的元素列表。

# 声明一个列表对象的变量l>>> l = ['l', 'i', 'm', 'a', 'n', 'm', 'a', 'n']>>> type(l)<type 'list'># 查看list类型的定义>>> help(list)# 查看list类型的属性和方法>>> dir(list)# 让Python2中也可以兼容Python3的print函数用法>>> from __future__ import print_function

二、对象创建 & 赋值

赋值运算:向内存申请一空闲内存单元存储列表,然后将变量名指向此内存单元首地址,就可通过变量名操作此内存单元数据。

>>> l = ['5', '2', '1']
# 方式1: 通过字面量形式创建>>> l = ['5', '2', '1']# 方式2: 通过类型创建"""list() -> new empty listlist(iterable) -> new list initialized from iterable's items""">>> l = list('521')['5', '2', '1']

[] 空列表

>>> list()[]

列表推导式

英文全称:List Comprehensions。

列表推导式提供了从 序列 创建列表的简单途径。

>>> vec = [2, 4, 6]>>> [3*x for x in vec][6, 12, 18]>>> [[x, x**2] for x in vec][[2, 4], [4, 16], [6, 36]]

方法调用

# 这里调用 .strip() 方法去除前后空格>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']>>> [weapon.strip() for weapon in freshfruit]['banana', 'loganberry', 'passion fruit']# 使用 .lower() 将内容改为小写>>> L = ['Hello', 'World', 'IBM', 'Apple']>>> [s.lower() for s in L]['hello', 'world', 'ibm', 'apple']# 使用复杂表达式或嵌套函数>>> [str(round(355/113, i)) for i in range(1, 6)]['3.1', '3.14', '3.142', '3.1416', '3.14159']

条件过滤

>>> [3*x for x in vec if x > 3][12, 18]>>> [3*x for x in vec if x < 2][]

以下是一些关于循环和其它技巧的演示:

>>> [m   n for m in 'ABC' for n in 'XYZ']['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']>>> vec1 = [2, 4, 6]>>> vec2 = [4, 3, -9]>>> [x*y for x in vec1 for y in vec2][8, 6, -18, 16, 12, -36, 24, 18, -54]>>> [x y for x in vec1 for y in vec2][6, 5, -7, 8, 7, -5, 10, 9, -3]>>> [vec1[i]*vec2[i] for i in range(len(vec1))][8, 12, -54]

用两个变量来生成 list

for循环其实可以同时使用两个甚至多个变量,比如dictitems()可以同时迭代key和value:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> for k, v in d.items():...     print(k, '=', v)...y = Bx = Az = C

因此,列表生成式也可以使用两个变量来生成list:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> [k   '='   v for k, v in d.items()]['y=B', 'x=A', 'z=C']

使用 range

set[x:y:z] 是一个完整的函数

a = range(0,5)type(a)   # rangeprint(a)  # range(0, 3) >>> l = list(range(5))[0, 1, 2, 3, 4]>>> [x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]>>> [x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]

字符串和列表

>>> s = '123'>>> s[::-1]  # 字符串反向遍历'321'>>> s  # 不会改变原来的值'123'>>> list(s)['1', '2', '3']>>> list(s)[::1]['1', '2', '3']>>> ''.join(list(s)[::1])'123'# 使用列表的 reverse 方法>>> a =  list(s)>>> a['1', '2', '3']>>> a.reverse()>>> a['3', '2', '1']

应用

列出目录名:列出当前目录下的所有文件和目录名,可以通过一行代码实现:

>>> import os # 导入os模块,模块的概念后面讲到>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录['.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace']

属性

>>>len([1, 2, 3])3>>> max(['d', '2', 'a']) 'd'>>> max(['d', '2', 'ag'])'d'

查找遍历

索引

>>> a=['Google', 'Runoob', 'Taobao']>>> a[2]'Taobao'>>> a[-2]'Runoob'>>> a[1:]['Runoob', 'Taobao']

使用for循环遍历

>>> g = (x * x for x in range(10))>>> for n in g:...     print(n)... 014...

使用next()遍历

>>> next(g)0>>> next(g)1>>> next(g)4...>>> next(g)81>>> next(g)Traceback (most recent call last):  File "<stdin>", line 1, in <module>StopIteration

in/not in 是否存在

>>>3 in [1, 2, 3]True>>> for x in [1, 2, 3]: print(x, end=" ")

增加 & 删除


append 添加 & pop 删除

列表是可变的:可以不改变物理地址指向的前提下,实现原地修改。方法:append,pop。

# 添加对象到最后>>> l.append('!')>>> l['a', 'b', 'c', 'd', '!']>>> id(l)140550742839456# 从列表中删除指定索引位置的对象,L.pop([index]) -> item,默认index的值为-1>>> l.pop(-1)'!'>>> l['a', 'b', 'c', 'd']>>> id(l)140550742839456
>>> l = ['5', '2', '1']# .append(object)>>> l.append('!')>>> l['5', '2', '1', '!']# .count(value)>>> l.count('!')1>>> l.count('?')0# .extend(iterable)>>> l.extend('1314')  # 自动切割了元素>>> l['5', '2', '1', '!', '1', '3', '1', '4']# .index(value, [start, [stop]])  # 查找值出现在了哪个位置>>> l.index('!')3>>> l.index('?')Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: '?' is not in list    # .insert(index, object)>>> l.insert(len(l), '?')>>> l['5', '2', '1', '!', '1', '3', '1', '4', '?']# .pop([index])>>> l.pop(-1)'?'>>> l.pop(len(l))Traceback (most recent call last):  File "<stdin>", line 1, in <module>IndexError: pop index out of range>>> l['5', '2', '1', '!', '1', '3', '1', '4']

# .remove(value)>>> l.remove('!')>>> l.remove('?')Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: list.remove(x): x not in list>>> l['5', '2', '1', '1', '3', '1', '4']        # .reverse()>>> l.reverse()>>> l['4', '1', '3', '1', '1', '2', '5']# .sort(cmp=None, key=None, reverse=False)>>> l.sort(key=lambda i: i, reverse=True)>>> l['5', '4', '3', '2', '1', '1', '1']>>> l = ['5', '2', '1', '1', '3', '1', '4']  >>> 'x' in l and l.remove('x') # 加上这个判断,删除不存在的就不会报错False>>> '1' in l and l.remove('1')  # 只删除第一次找到的>>> l['5', '2', '1', '3', '1', '4']

del 删除

  • 使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。

  • 可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:

#!/usr/bin/python3 list = ['Google', 'Runoob', 1997, 2000] print("原始列表 : ", list)del list[2]print("删除第三个元素 : ", list)

以上实例输出结果:

原始列表 :  ['Google', 'Runoob', 1997, 2000]删除第三个元素 :  ['Google', 'Runoob', 2000]

>>> a = [1, 2, 3, 4, 5, 6]>>> del a[0]>>> a[2, 3, 4, 5, 6]>>> a = [1, 2, 3, 4, 5, 6]>>> del a[2:4]>>> a[1, 2, 5, 6]# 删除全部>>> del a[:]>>> a[]

也可以用 del 删除实体变量:

>>> del a

运算


身份运算 is & ==

常用于比较两个对象是否指向同一个 内存单元

is 比较地址,== 比较数值

>>> l is ['5', '2', '1']False>>> l  = ['5', '2', '1']>>> l  ==  ['5', '2', '1']True

数学运算

结果总是隐式转换为复杂类型

# 加法,可结合赋值运算 =>>>[1, 2, 3]   [4, 5, 6] [1, 2, 3, 4, 5, 6]>>> l = [1, 2, 3]>>> l  = [4, 5, 6] >>> l[1, 2, 3, 4, 5, 6]# 乘法,可结合赋值运算*=>>> l * 2[1, 2, 3, 1, 2, 3]>>>['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!']

逻辑运算

# 与, 都为真为真>>> [] and l[]# 或, 一个真即真>>> [] or l['5', '2', '1']# 非,总是隐式转换为布尔对象>>> not lFalse

由于列表对象为可变对象, = / * = 操作的本质为向变量指向的原内存空间添加新的对象,所以指向的内存地址不变


列表运算符

列表对 和 * 的操作符与字符串相似。 号用于组合列表,* 号用于重复列表。

操作符 描述
组合
* 重复
[num] 索引
[:] 截取
in 元素是否存在于列表中
not in

函数

1、Python 内置函数

函数 说明
len(list) 列表元素个数
max(list) 返回列表元素最大值
min(list) 返回列表元素最小值
list(seq) 将元组转换为列表

2、列表自身方法

  • . 开头是列表自身方法,非内置方法。

  • 方法中 方括号[] 表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。

方法 描述
l.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。
l.extend(l1) 通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = l1。
l.insert(i, x) 在指定位置插入一个元素,原地修改。
第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。
l.remove(x) 删除列表中值为 x 的第一个元素,原地修改。如果没有这样的元素,就会返回 ValueError错误。
l.pop([i]) 从列表的指定位置移除元素,并将其返回。
索引超出则抛出IndexError异常,index默认为-1( 索引超出则抛出IndexError异常,index默认为-1)
l.clear() 移除列表中的所有项,等于del a[:]。
l.index(value, [start, [stop]]) 计算从start到stop中间value在列表中的索引值并返回,不存在抛出ValueError异常
l.count(x) 返回 x 在列表中出现的次数。
l.sort(cmp=None, key=None, reverse=False) 将列表按照key对应的函数排序,reverse是否倒序,原地修改
l.reverse() 将列表的元素倒序,原地修改
l.copy() 浅复制,等于a[:]。
l.index(value, [start, [stop]]) 计算从start到stop中间value在列表中的索引值并返回,不存在抛出ValueError异常
l.insert(index, object) 将object插入列表中索引为index的位置,

将列表当做堆栈使用

append、pop

列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。


将列表当作队列使用

append、popleft

也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。

>>> from collections import deque>>> queue = deque(["Eric", "John", "Michael"])>>> queue.append("Terry")           # Terry arrives>>> queue.append("Graham")          # Graham arrives>>> queue.popleft()                 # The first to arrive now leaves'Eric'>>> queue.popleft()                 # The second to arrive now leaves'John'>>> queue                           # Remaining queue in order of arrivaldeque(['Michael', 'Terry', 'Graham'])

嵌套列表

以下实例展示了3X4的矩阵列表:

>>> matrix = [...     [1, 2, 3, 4],...     [5, 6, 7, 8],...     [9, 10, 11, 12],... ]

以下实例将 3X4 的矩阵列表转换为 4X3 列表:

>>> [[row[i] for row in matrix]  for i in range(4)][[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

以下实例也可以使用以下方法来实现:

>>> transposed = []>>> for i in range(4):...     transposed.append([row[i] for row in matrix])...>>> transposed[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

另外一种实现方法:

>>> transposed = []>>> for i in range(4):...     # the following 3 lines implement the nested listcomp...     transposed_row = []...     for row in matrix:...         transposed_row.append(row[i])...     transposed.append(transposed_row)...>>> transposed[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]


来源:https://www.icode9.com/content-4-845501.html

(0)

相关推荐

  • 链表

    顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行空充时又需要进行数据的搬迁,所以使用起来并不是很灵活.链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理链表的定义链表(Linke ...

  • UC头条:聊聊python中的list——基本操作

    在学习数据结构的时候,从老师和同学口中得知了python中用于实现线性表的list(列表).在查阅相关资料后,感觉这真是一个有趣又好用的数据结构.于是打算写几篇博客,加深对list原理和使用方法的理解 ...

  • Python|列表与元组

    问题描述列表可以进行增删改查,但元组一经初始化后就不能再进行修改了,需要对增删改查进行掌握.解决方案列表创建只需要用逗号把不同的数据项分隔开即可,列表用的是"[]",而元组用的是& ...

  • 当年苏联援助的156项重点工程列表

    当年苏联援助的156项重点工程列表 山佳20062020-01-21 20:26:37 煤炭(25项) 总计采煤2165万吨 洗煤950万吨 鹤岗东山1号立井 续建 鹤岗 50~55 采煤90万吨 鹤 ...

  • 王者荣耀全民王者时代来了,好友列表全是王者,这是天美的一步棋

    大家好我是指尖,王者荣耀算得上一款全民竞技类手游,相对来说公平性也是很高的,但是这么多个赛季过去了,大家有没有觉得这个游戏越来越变味了呢?不太喜欢玩游戏的,把它当成了一个养成类游戏,以积攒皮肤为乐趣, ...

  • 中国历朝历代302位皇帝寿命列表大全(值得收藏)

    如果要问中国历朝历代都有哪些皇帝?相信很多人会把"三皇五帝"都列举出来.其实不然,尧.舜等都是部落的首领,可以称为大王.中国历史上第一个皇帝是秦始皇嬴政,从"秦始皇&qu ...

  • 清朝皇帝子嗣最全列表:康熙最能生,乾隆最能熬,还有三个绝了后

    虽然说清朝皇帝也是三宫六院,坐拥佳丽无数,但清朝皇帝生育能力一般,而且越往后,生育能力越差,直到绝后.就像清朝的发展一样,从兴旺到凋零,直至消亡.本文就为大家盘点下从皇太极到末代皇帝溥仪,大清十一帝的 ...

  • 行测数量关系:利润问题不用愁,列表来解很轻松

    在事业单位考试考试中,利润问题是常考的题型,也是我们短期内可以提升的题型,但是令我们头疼的是利润问题里往往会出现很多的量,导致我们不容易理清各个量之间的关系,接下来中公事业单位招聘网带大家学习一下如何 ...

  • 汇总:上世纪六七十年代我国出版的长篇小说书名列表

    从1972年2月起,我国恢复出版长篇小说,到1976年10月总计出版了近百部,其中人民文学出版社.上海人民出版社走在前面. 作者以新人为主,大多数是工农兵和知识青年,有的因此走上文坛,后来成为著名作家 ...

  • 日本历代天皇列表,从公元前660年一直传承至今

    日本历代天皇列表,从公元前660年一直传承至今

  • 201汉字部首系统排列表

    山东章丘一职专 250200 马国梁 现行的201个汉字部首按照书写的笔顺进行系统排列的结果如下表所示.其中左边数字是它们的序号,右边括号内的数字是将它们作为起笔部首时的字数. 201汉字部首系统排列 ...

  • 史上最清晰的抗日战争时期八路军序列表{1...

    史上最清晰的抗日战争时期八路军序列表{1938年),含编制.职务.姓名和年龄,具体到团级. 看了一下,很多团级领导都是后来的牛人! #历史#

  • 《操盘博弈论II》全系列课程列表

    技术分析体系就好似一辆行驶在资本市场中的汽车,分析篇中的每一节都是车上的一个零件,只有将这一个个零件有机的结合起来,才能让技术分析这辆车安全的开动起来.大家一起动动手.动动脑,只要把零件都组装起来,就 ...