列表类型简介

列表类型是一个容器,它里面可以存放任意数量、任意类型的数据。

例如下面的几个列表中,有存储数值的、字符串的、内嵌列表的。不仅如此,还可以存储其他任意类型。

>>> L = [1, 2, 3, 4]

>>> L = ["a", "b", "c", "d"]

>>> L = [1, 2, "c", "d"]

>>> L = [[1, 2, 3], "a", "b", [4, "c"]]

python中的列表是一个序列,其内元素是按索引顺序进行存储的,可以进行索引取值、切片等操作。

列表结构

列表是可变对象,可以原处修改列表中的元素而不会让列表有任何元数据的变动。

>>> L = ["a", "b", "c"]

>>> id(L), id(L[0])

(57028736, 55712192)

>>> L[0] = "aa"

>>> id(L), id(L[0])

(57028736, 56954784)

从id的变动上看,修改列表的第一个元素时,列表本身的id没有改变,但列表的第一个元素的id已经改变。

看了下面列表的内存图示就很容易理解了。

上面是L = ["a", "b", "c"]列表的图示。变量名L存储了列表的内存地址,列表内部包含了类型声明、列表长度等元数据,还保存了属于列表的3个元素的内存地址。需要注意的是,列表元素不是直接存在列表范围内的,而是以地址的形式保存在列表中。

所以,修改列表中的元素时,新建一个元素"aa"(之所以新建,是因为字符串是不可变类型),列表本身并没有改变,只是将列表中指向第一个元素的地址改为新数据"aa"的地址。

因为修改列表数据不会改变列表本身属性,这种行为称为"原处修改"。

所以,列表有几个主要的的特性:

列表中可以存放、嵌套任意类型的数据

列表中存放的是元素的引用,也就是各元素的地址,因此是列表可变对象

列表是可变序列。所以各元素是有位置顺序的,可以通过索引取值,可以通过切片取子列表

构造列表

有两种常用的构造列表方式:

使用中括号[]

使用list()构造方法

使用(中)括号构建列表时,列表的元素可以跨行书写,这是python语法中各种括号类型的特性。

例如:

>>> [] # 空列表

>>> [1,2,3]

[1, 2, 3]

>>> L = [

1,

2,

3

]

>>> list('abcde')

['a', 'b', 'c', 'd', 'e']

>>> list(range(0, 4))

[0, 1, 2, 3]

上面range()用于生成一系列数值,就像Linux下的seq命令一样。但是range()不会直接将数据生成出来,它返回的是一个可迭代对象,表示可以一个一个地生成这些数据,所以这里使用list()将range()的数据全部生成出来并形成列表。

中括号方式构造列表有一个很重要的特性:列表解析,很多地方也称为"列表推到"。例如:

>>> [x for x in 'abcdef']

['a', 'b', 'c', 'd', 'e', 'f']

list()是直接将所给定的数据一次性全部构造出来,直接在内存中存放整个列表对象。列表推导方式构造列表比list()要快,且性能差距还挺大的。

列表基本操作

列表支持+ *符号操作:

>>> L = [1,2,3,4]

>>> L1 = ['a','b','c']

>>> L + L1

[1, 2, 3, 4, 'a', 'b', 'c']

>>> [1,2] + list("34")

[1, 2, '3', '4']

>>> L * 2

[1, 2, 3, 4, 1, 2, 3, 4]

>>> 2 * L

[1, 2, 3, 4, 1, 2, 3, 4]

可以通过+=的方式进行二元赋值:

>>> L1 = [1,2,3,4]

>>> L2= [5,6,7,8]

>>> L1 += L2

>>> L1

[1, 2, 3, 4, 5, 6, 7, 8]

L1 += L2的赋值方式对于可变序列来说(比如这里的列表),性能要好于L1 = L1 + L2的方式。前者直接在L1的原始地址内进行修改,后者新创建一个列表对象并拷贝原始L1列表。但实际上,性能的差距是微乎其微的,前面说过列表中保存的是元素的引用,所以拷贝也仅仅只是拷贝一些引用,而非实际数据对象。

列表是序列,序列类型的每个元素都是按索引位置进行存放的,所以可以通过索引的方式取得列表元素:

>>> L = [1,2,3,4,5]

>>> L[0]

1

>>> L = [

... [1,2,3,4],

... [11,22,33,44],

... [111,222,333,444]

... ]

>>> L[0][2]

3

>>> L[1][2]

33

>>> L[2][2]

333

当然,也可以按索引的方式给给定元素赋值,从而修改列表:

>>> L = [1,2,3,4,5]

>>> L[0] = 11

通过赋值方式修改列表元素时,不仅可以单元素赋值修改,还可以多元素切片赋值。

>>> L[1:3] = [22,33,44,55]

>>> L

[11, 22, 33, 44, 55, 4, 5]

上面对列表的切片进行赋值时,实际上是先取得这些元素,删除它们,并插入新数据的过程。所以上面是先删除[1:3]的元素,再在这个位置处插入新的列表数据。

所以,如果将某个切片赋值为空列表,则表示直接删除这个元素或这段范围的元素。

>>> L

[11, 22, 33, 44]

>>> L[1:3] = []

>>> L

[11, 44]

但如果是将空列表赋值给单个索引元素,这不是表示删除元素,而是表示将空列表作为元素嵌套在列表中。

>>> L = [1,2,3,4]

>>> L[0] = []

>>> L

[[], 2, 3, 4]

这两种列表赋值的区别,在理解了前文所说的列表结构之后应该不难理顺。

列表其它操作

列表是一种序列,所以关于序列的操作,列表都可以用,比如索引、切片、各种序列可用的函数(比如append()、extend()、remove()、del、copy()、pop()、reverse())等。详细内容参见:python序列操作

除了这些序列通用操作,列表还有一个专门的列表方法sort,用于给列表排序。

列表排序sort()和sorted()

sort()是列表类型的方法,只适用于列表;sorted()是内置函数,支持各种容器类型。它们都可以排序,且用法类似,但sort()是在原地排序的,不会返回排序后的列表,而sorted()是返回新的排序列表。

>>> help(list.sort)

Help on method_descriptor:

sort(...)

L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*

>>> help(sorted)

Help on built-in function sorted in module builtins:

sorted(iterable, /, *, key=None, reverse=False)

Return a new list containing all items from the iterable in ascending order.

A custom key function can be supplied to customize the sort order, and the

reverse flag can be set to request the result in descending order.

本文仅简单介绍排序用法。

例如列表L:

>>> L = ['python', 'shell', 'Perl', 'Go', 'PHP']

使用sort()和sorted()排序L,注意sort()是对L直接原地排序的,不是通过返回值来体现排序结果的,所以无需赋值给变量。而sorted()则是返回排序后的新结果,需要赋值给变量才能保存排序结果。

>>> sorted(L)

['Go', 'PHP', 'Perl', 'python', 'shell']

>>> L

['python', 'shell', 'Perl', 'Go', 'PHP']

>>> L.sort()

>>> L

['Go', 'PHP', 'Perl', 'python', 'shell']

不难发现,sort()和sorted()默认都是升序排序的(A

>>> L.sort(reverse=True)

>>> L

['shell', 'python', 'Perl', 'PHP', 'Go']

在python 3.x中,sort()和sorted()不允许对包含不同数据类型的列表进行排序。也就是说,如果列表中既有数值,又有字符串,则排序操作报错。

sort()和sorted()的另一个参数是key,它默认为key=None,该参数用来指定自定义的排序函数,从而实现自己需要的排序规则。

例如,上面的列表不再按照默认的字符顺序排序,而是想要按照字符串的长度进行排序。所以,自定义这个排序函数:

>>> def sortByLen(s):

... return len(s)

然后通过指定key = sortByLen的参数方式调用sort()或sorted(),在此期间还可以指定reverse = True:

>>> L = ['shell', 'python', 'Perl', 'PHP', 'Go']

>>> sorted(L,key=sortByLen)

['Go', 'PHP', 'Perl', 'shell', 'python']

>>> L.sort(key=sortByLen,reverse=True)

>>> L

['python', 'shell', 'Perl', 'PHP', 'Go']

再例如,按照列表每个元素的第二个字符来排序。

def f(e):

return e[1]

L = ['shell', 'python', 'Perl', 'PHP', 'Go']

sorted(L, key=f)

L.sort(key=f)

更多的排序方式,参见:sorting HOWTO。比如指定两个排序依据,一个按字符串长度升序排,长度相同的按第2个字符降序排。用法其实很简单,不过稍占篇幅,所以本文不解释了。

列表迭代和解析

列表是一个序列,可以使用in测试,使用for迭代。

例如:

>>> L = ["a","b","c","d"]

>>> 'c' in L

True

>>> for i in L:

... print(i)

...

a

b

c

d

再说列表解析,它指的是对序列中(如这里的列表)的每一项元素应用一个表达式,并将表达式计算后的结果作为新的序列元素(如这里的列表)。

通俗一点的解释,以列表序列为例,首先取列表各元素,对每次取的元素都做一番操作,并将操作后得到的结果放进一个新的列表中。

因为解析操作是一个元素一个元素追加到新列表中的,所以也称为"列表推导",表示根据元素推导列表。

最简单的,将字符串序列中的各字符取出来放进列表中:

>>> [ i for i in "abcdef" ]

['a', 'b', 'c', 'd', 'e', 'f']

这里是列表解析,因为它外面使用的是中括号[],表示将操作后的元素放进新的列表中。可以将中括号替换成大括号,就变成了集合解析,甚至字典解析。但注意,没有直接的元组解析,因为元组的括号是特殊的,它会被认为是表达式的优先级包围括号,而不是元组构造符号。

取出元素对各元素做一番操作:

>>> [ i * 2 for i in "abcdef" ]

['aa', 'bb', 'cc', 'dd', 'ee', 'ff']

>>> L = [1,2,3,4]

>>> [ i * 2 for i in L ]

[2, 4, 6, 8]

>>> [ (i * 2, i * 3) for i in L ]

[(2, 3), (4, 6), (6, 9), (8, 12)]

解析操作和for息息相关,且都能改写成for循环。例如,下面两个语句得到的结果是一致的:

[ i * 2 for i in "abcdef" ]

L = []

for i in "abcdef":

L.append(i * 2)

但是解析操作的性能比for循环要更好,正符合越简单越高效的理念。

学过其他语言的人,估计已经想到了,解析过程中对各元素的表达式操作类似于回调函数。其实在python中有一个专门的map()函数,它以第一个参数作为回调函数,并返回一个可迭代对象。也就是说,也能达到和解析一样的结果。例如:

>>> def f(x):return x * 2

...

>>> list(map(f,[1,2,3,4]))

[2, 4, 6, 8]

map()函数在后面的文章会详细解释。

python列表用什么符号表示_python列表类型相关推荐

  1. python列表中包含元祖_python列表与元祖

    python 的列表和元素: 共同点:有序的 区别:1.列表可以修改增加删除列表内容,元组不能修改 联系:元组中包含列表的元素,可以修改列表元素. 分析:1.列表:LIST1=[1,2,3,4,5,6 ...

  2. python列表元素零的移动_python列表多行

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这个列表推导式共有145列: memberdef_list = and std: ...

  3. python列表使用技巧与方法_Python列表的相关操作与方法

    Python列表的相关操作与方法 1.列表 why:int.bool.str存在缺陷 str:存储少量的数据:所有的操作获取的内容都是 str类型,存储的数据类型单一. what: 列表可以承载任意数 ...

  4. python列表的排序方法是_Python列表排序 reverse、sort、sorted 操作方法详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...

  5. python删除列表元素的所有方法_python 列表删除所有指定元素的方法

    python 列表删除所有指定元素的方法 如下所示: a = [1,1,1,2,3,45,1,2,1] a.remove(1) result: [1,1,2,3,45,1,2,1] while 1 i ...

  6. python元组和列表都支持的方法_python列表方法和元组

    Python列表方法 1.append()在列表末尾追加新对象 >>> lst=[1,2,3] >>> lst [1, 2, 3] >>> lst ...

  7. python 中m op n运算_Python数字类型、数值运算操作符、数值运算函数

    一.数字类型 (一)整数类型int(integer) int与数学中的整数概念一致 特点:可正可负,没有取值范围 整数有四种表示形式: 十进制,没有引导符号:10, 88,-485 二进制,以0(零) ...

  8. python里元组和列表的共同点和不同点_Python列表和元组的相同点和不同点是什么...

    相同点:属于有序序列.可以强制转换.使用len()统计元素个数.使用count()统计指定元素的出现次数.不同点:1.元组类型为tuple,列表类型为list:2.元组不能修改,列表可以根据索引来修改 ...

  9. python numpy 奇数偶数行互换_python 列表推导式(经典代码)(21)

    文章首发微信公众号,微信搜索:猿说python 截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率 ...

  10. python将列表的第一列删除_python列表基本操作:索引(访问),切片,扩展,删除,追加,统计,长度,获取下标等...

    List(列表) 列表,是一种用于保存一系列有序项目的集合,在 Python 中你需要在它们之间加上一个逗号 注意:列表是可变数据类型 列表的基本操作有:索引(访问),切片,扩展,删除,追加,统计,长 ...

最新文章

  1. [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
  2. android timer后函数继续执行_Android连载34更新数据库以及使用SDK自带adb工具
  3. 运行时修改Standard shader的Mode
  4. jquerymobile iscrollview
  5. 伯克利cs61b总结贴
  6. 直流电动机调速matlab,基于MATLAB龙门刨床直流电动机调速系统仿真研究
  7. 【IT生活】成长,没有想象的那么迫切 ——叶绍琛
  8. 读书笔记之《随机漫步的傻瓜》
  9. 毕设(一):正则化极限学习机(RELM)、在线学习的极限学习机(OS-ELM)、带遗忘机制的在线学习极限学习机(FOS-ELM)
  10. [06.21] LinkLabel 代码重构和我的SinaWeibo7 Project Todolist
  11. JDK9-G1 -XX:ParallelGCThreads 默认选择源码解析
  12. python uniform函数均匀分布_numpy.random.uniform均匀分布
  13. JAVA MemCache 史无前例的详细讲解!看完包精通MEMCACHE!
  14. 呕心沥血梳理C++新标准超好用的新特性(实战必备)
  15. 有用的和不为人知的Java特性
  16. 狄利克雷卷积与积性函数
  17. 新浪微博橙v升级金v的多种方法
  18. 一文详解自动驾驶的动态驾驶任务(DDT) | 自动驾驶系列
  19. linux查察删除端口
  20. 《纪念碑谷》美术风格制作

热门文章

  1. Windows 安装两个MYSQL实例
  2. java朴素贝叶斯_java实现朴素贝叶斯算法
  3. 第 7 章 Neutron - 079 - 在 ML2 中 enable local network
  4. mysql登录出现1045错误
  5. swagger 参数
  6. Android StickHeaderRecyclerView - 让recyclerview头部固定
  7. 关于 JVM 内存的 N 个问题(转)
  8. POJ 2393 Yogurt factory
  9. 脱壳_详细_使用的方法_03
  10. [导入]意外的,博客被点名了。参与游戏吧。