情人节,给妹子讲python-S01E01好用的列表

简介: 今天开始学python啦,不过我们从哪里开始学起呢? Python中有一种被称之为“容器”的数据类型,专门用来存放其他类型的对象,就好比小时候用的文具盒,里面放着铅笔、尺子、橡皮等等。很多人刚刚使用Python的时候,往往最先接触的就是这种容器对象,比如列表、字典、元组等等。

本文来自云栖社区官方钉群“Python技术进阶”,了解相关信息可以关注“Python技术进阶”。

今天开始学python啦,不过我们从哪里开始学起呢?

Python中有一种被称之为“容器”的数据类型,专门用来存放其他类型的对象,就好比小时候用的文具盒,里面放着铅笔、尺子、橡皮等等。很多人刚刚使用Python的时候,往往最先接触的就是这种容器对象,比如列表、字典、元组等等。它们功能全面,使用也很方便,可以解决很多实际问题。

那么,第一季我们就首先从这些好用、实用的python容器入手吧,第一个就介绍列表:

Python列表用起来非常灵活,它有三大优点,我们一个一个来说,聊完了这三个优点,基本上列表的基本操作我们就掌握了:

第一个优点:

列表里想装啥就装啥,即:他可以包含不同种类、任意类型的对象,甚至可以嵌套列表,专业点的词儿叫:异构性;

我们看一个例子:

L1 = [1, 2, 3, 4, 5]
L2 = [1, 'spam', [2.3, 4]]
L3 = []

看这三个列表的初始化过程,异构性就搞清楚了,特别是L2列表,它同时包含了好几种不同的数据类型,甚至还嵌套了列表。

第二个优点:

列表里装的元素都是有顺序的,可以按照位置序号获取单个元素,也可以用分片的方法来进行多个连续元素的获取,来个专业词汇,叫做:有序性。

按位置序号索引,例如L1[2]这种方式来访问列表中的元素只是最简单的一种,我来重点来说说分片操作这个独特用法,先看看这个例子:

L = [1,2,3,4,5,6,7,8]
print(L[1:3])

[2, 3]

我们从列表L中从左往右截取了一个片段。关于截取片段左右边界与索引值的对应关系,我们只需记住这么一个口诀“左闭右开”就OK了:

分片索引中第一个参数1表示左侧开始的索引1(从0开始计数),因此起始的元素就是整形数2,第二个参数3表示在右侧终止的索引值为3,即整形数4,但要记住他是不包含在截取的序列中的。

分片还有几种常见用法:

如果省略掉终止索引,就表示一直截取到末尾:

L = [1,2,3,4,5,6,7,8]
print(L[1:])

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

同理,如果省略掉起始索引,就表示从起始元素就开始截取:

L = [1,2,3,4,5,6,7,8]
print(L[:4])

[1, 2, 3, 4]

还可以用负索引,目前我们使用的都是正索引,即从左往右的索引值,最左侧的索引值为0,往右依次加1;还有一种负索引的表示法,即从右往左数,最右侧是-1,往左依次减1,即-2,-3以此类推:

L = [1,2,3,4,5,6,7,8]
print(L[3:-1])

[4, 5, 6, 7]

【妹子问】:那我想跳着截取呢?

那就用上第三个参数,步进值参数,这个默认是1,即1个挨着1个的取,如果我们想跳着截取,那就得专门设置这个步进参数了。

L = [1,2,3,4,5,6,7,8]
print(L[0::2])

[1, 3, 5, 7]

这时候【妹子问了一个很有内涵的问题】:我对截取出的分片进行修改,会影响到原始的列表吗?

那我们还是眼见为实:

L = [1,2,3,4,5,6,7,8]
b = L[3:-1]
print('before change:b={}'.format(b))
b[0]=111
print('after change:b={}'.format(b))
print('after change:L={}'.format(L))

before change:b=[4, 5, 6, 7]
after change:b=[111, 5, 6, 7]
after change:L=[1, 2, 3, 4, 5, 6, 7, 8]

很明显,对原始列表L进行分片切割后,产生了一个全新的列表。用变量b获取了L的分片后,实质是获取了L分片的一个新的独立拷贝。因此,你在列表b上做修改,是影响不了L的。

第三个优点:

列表的大小和内容可以随意改变,在插入、删除、修改列表元素时,不需要建立一份新的列表拷贝,而是在原来的内存地址上直接修改列表对象。这个叫“本地可修改”

首先看增加新元素的三个使用场景:

L = [1,2,3,4]
L.append(5)
print(L)

[1, 2, 3, 4, 5]

L = [1,2,3,4]
L.insert(1,10)
print(L)

[1, 10, 2, 3, 4]

L = [1,2,3,4]
L.extend([11,22,33])
print(L)

[1, 2, 3, 4, 11, 22, 33]

这三个用法有些不同,append方法只能在尾部加入;insert方法可在任意位置加入,比如上面例子,我们在列表的索引位置为1的地方加入元素10,如果指定的索引值大于序列的总长度,则自动加到末尾;extend方法则可以在尾部一次性加入多个元素

这时,【妹子自己操作了一把】:

L = [1,2,3,4,5]
L = L.insert(6,2)
print(L[2])

Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 3, in <module>
print(L[2])
TypeError: 'NoneType' object is not subscriptable

然后,就没有然后了。。。这里犯了一个常见的错误,因为我们说过插入是就地修改,而不是返回修改后的新列表。Insert方法的返回值是None,这么干换句话说,会彻底失去之前列表的引用,因为你把None值赋给了L,你就无法找到之前的列表了。append和extend方法也是这样。

删除,依据使用需求也有这几种使用场景:

最简单直接的,用remove方法,传入指定要删除的对象,注意:它也是在原列表上就地删除,返回值为None

L1 = ['aa','bb','cc']
L1.remove('aa')
print(L1)

['bb', 'cc']

这里注意,还有一个内置方法del,它额外的功能是可以删除列表中的一个分片

del L1[1:3]

还有一个pop方法,它在末端删除一个元素,并可以将删除的元素作为返回值返回给调用者

L1 = [1,2,3]
print(L1.pop())#末端删除一个元素,弹出删除的值
print(L1)

3
[1, 2]

【妹子问】那么元素修改,除了像下面这种直接用索引做元素修改的情况外,还有什么有趣的用法?

L = [4,5,6,7,8,9]
L[0] = 0

那必须要来点有意思的,主要就说分片赋值和本地排序这两个问题:

L = [4,5,6,7,8,9]
L[1:3] = ['aa','bb','cc','dd']
print(L)

[4, 'aa', 'bb', 'cc', 'dd', 7, 8, 9]

分片赋值的本质是先在原列表上删除指定分片,然后在删除的位置插入新的列表,因此左右两边的长度可以不等。

本地排序非常方便,看看下面的例子就明白了。注意排序也是在本地修改,而不是将排好序的列表作为返回值返回。

L = [1,5,3,8,3,2,10]
L.sort()
print(L)
L.reverse()
print(L)

[1, 2, 3, 3, 5, 8, 10]
[10, 8, 5, 3, 3, 2, 1]

原文发布时间为:2018-07-17
本文作者:酱油哥
本文来自云栖社区官方钉群“Python技术进阶”,了解相关信息可以关注“Python技术进阶”。

Python技术进阶交流群


_2019_01_15_10_28_39

相关文章
|
1天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
21 14
|
3天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
22 10
|
20天前
|
数据处理 开发者 Python
Python中的列表推导式:简洁高效的数据处理
在编程世界中,效率和可读性是代码的两大支柱。Python语言以其独特的简洁性和强大的表达力,为开发者提供了众多优雅的解决方案,其中列表推导式便是一个闪耀的例子。本文将深入探讨列表推导式的使用场景、语法结构及其背后的执行逻辑,带你领略这一特性的魅力所在。
|
23天前
|
开发者 Python
探索Python中的列表推导式:简洁而强大的工具
【10月更文挑战第41天】 在编程的世界中,效率与简洁是永恒的追求。本文将深入探讨Python编程语言中一个独特且强大的特性——列表推导式(List Comprehension)。我们将通过实际代码示例,展示如何利用这一工具简化代码、提升性能,并解决常见编程问题。无论你是初学者还是资深开发者,掌握列表推导式都将使你的Python之旅更加顺畅。
|
26天前
|
Python
探索Python中的列表推导式
【10月更文挑战第38天】本文深入探讨了Python中强大而简洁的编程工具——列表推导式。从基础使用到高级技巧,我们将一步步揭示如何利用这个特性来简化代码、提高效率。你将了解到,列表推导式不仅仅是编码的快捷方式,它还能帮助我们以更加Pythonic的方式思考问题。准备好让你的Python代码变得更加优雅和高效了吗?让我们开始吧!
|
2月前
|
Python
探索Python中的列表推导式
【10月更文挑战第20天】在编程世界里,时间就是一切。Python的列表推导式是节约时间、简化代码的一大利器。本文将带你深入理解并有效利用这一强大工具,从基础到高级用法,让你的代码更加简洁高效。
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
19 6
|
1月前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
18 1
|
1月前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
32 2
|
2月前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
16 1