Python是网络开发者、数据科学家、机器学习工程师和系统管理员中流行的通用语言。现在,我们也可以用Python来构建跨平台的移动应用程序,用Kivy。由于Python的简单性、初学者友好性和丰富的插件生态系统,它正变得越来越流行。
我们可以像其他动态类型的语言一样,在Python中创建变量来存储单个数据记录。在我们的Python程序中,我们经常要在一个变量中保存一连串的数据记录。对于这些情况,我们可以使用 Python 的 list 数据结构,它允许你用一个变量创建和操作多个项目。
在本教程中,我将用实际例子解释你需要知道的关于 Python 列表的一切。同时,我们将讨论一些与列表有关的高级主题,如多维列表、映射和过滤。
先决条件
你需要安装 Python 3 解释器来开始学习。在大多数 Linux 发行版中,Python 3 已经预装。
在本教程中,我将使用python3 命令来执行 Python 脚本,因为我是在 Linux 上演示的。
列表语法和原则
一个 Python 列表是一个用逗号分隔的元素列表,周围有两个方括号。你可以在列表中添加任何元素类型。将下面的代码添加到一个名为main.py 的新文件中,创建一个简单的列表。
languages = ['Python', 'Go', 'Dart']
print(type(languages))
print(languages)
print(len(languages))
现在,用你的 Python 解释器的二进制名称运行上面的代码。
python3 main.py
上面的代码创建了一个有三个字符串元素的新列表。同时,它打印了languages 变量的类型、内容和项数,如下图所示。
正如你所看到的,len 函数返回列表的当前项目计数。
你可以通过提供两个方括号内的索引来访问每个元素。列表的索引从0 开始,就像计算机科学中的通用数组。例如,下面的代码打印出第二个元素的值。
languages = ['Python', 'Go', 'Dart']
print('The second element: ' + languages[1]) # Go
在 Python 中,你可以为索引输入负值。-1 指的是len(list) - 1 (最后一个元素),-2 指的是len(list) - 2 (最后一个元素之前的元素),以此类推。例如,如果你把第二行代码改成下面的样子,你将得到 "Dart "作为输出。
print('The last element: ' + languages[-1]) # Dart
你也可以用in 关键字来检查项目的存在。
languages = ['Python', 'Go', 'Dart']
if 'Python' in languages:
print('I <3 Python')
创建和初始化新的列表
我们已经用预先定义的值初始化了前面的列表。也有一些其他的方法来初始化列表。
初始化没有数值的列表
如果你事先不知道列表的内容,你可以创建一个空的列表,以后再填充它。例如,下面的代码通过在开始时创建一个空列表来创建前面的languages 列表。
languages = []
languages.append('Python')
languages.append('Go')
languages.append('Dart')
print(languages) # ['Python', 'Go', 'Dart']
这里我们使用append 方法向列表中添加一个新元素。
用生成的值初始化列表
我们经常需要生成即时列表。例如,有时我们要创建整数列表,如1 到10 ,1 到100 ,2 到50 ,等等。我们可以使用内置的range 函数来创建这些简单的数字序列,而不是把它们全部写出来。下面的代码创建了一个列表,其中的整数在1 和10 之间。
A = list(range(1, 10))
print(A) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
在上面的代码中,range 函数返回一个范围对象,所以我们必须使用list 函数从范围对象中获得一个新的列表。我们可以使用range 函数的第三个参数来增加数字之间的间隙或阶梯。例如,下面的代码在0 和10 之间生成了一个偶数的列表。
A = list(range(0, 10, 2))
print(A) # [0, 2, 4, 6, 8]
另外,你可以使用 Python 列表理解概念从一个现有的列表中生成一个新的列表,如下图所示。
numbers = [1, 20, 33, 44, 52]
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)
列表理解的概念使用列表迭代。我们将很快讨论更多的列表迭代例子
修改列表
正如我们之前讨论的,我们可以通过提供索引来访问列表元素。我们可以使用同样的语法来更新值。例如,下面的代码修改了第二个元素。
languages = ['Python', 'Go', 'Dart']
languages[1] = 'C++'
print(languages) # ['Python', 'C++', 'Dart']
Python 支持在一个赋值语句中进行多次赋值,所以我们可以一次改变多个值,如下图所示。
languages = ['Python', 'Go', 'Dart']
languages[1], languages[2] = 'C++', 'JavaScript'
print(languages) # ['Python', 'C++', 'JavaScript']
早些时候,我们使用append 方法在列表的末尾插入一个新元素。在这里,insert 方法可以将一个新元素插入到一个特定索引的特定位置。下面的代码片断通过在中间添加一个新的项目来扩展列表的内容。
A = list(range(1, 5))
middle = len(A) // 2
A.insert(middle, 'Hello')
print(A) # [1, 2, 'Hello', 3, 4]
如果你是 Python 的新手,你可能已经注意到这里有一个不寻常的情况。我们在一个整数列表中插入了一个字符串值。我们通常在静态类型的语言中用特定的数据类型创建列表,如 Java、Go、C、C++ 等。但是,Python 允许你用混合数据类型创建列表,因为它是一种动态类型的语言。因此,你可以在同一个列表中添加不同的数据类型。
把两个列表加在一起也是可能的。有两种方法可以合并两个列表:使用extend 方法和使用+ 操作符。请看下面的示例代码片断。
A = [2, 3]
def add_two_items():
global A
A.extend([10, 50])
def add_another_two_items():
global A
A = A + [100, 200]
add_two_items()
add_another_two_items()
print('A = ', A) # A = [2, 3, 10, 50, 100, 200]
在上面的示例代码中,add_two_items 函数修改了全局列表A ,使用extend 方法添加了一个有两个项目的新列表。另一方面,add_another_two_items 函数通过使用+ 操作符来做同样的工作。
用pop 和clear 方法从列表中删除项目
有时,由于pop 方法的存在,Python 列表结构看起来像著名的 Stack 数据结构。我们可以使用pop 方法,通过提供一个索引从列表中删除一个元素。例如,请看下面的代码片段。
A = [2, 44, 22, 0]
A.pop(1)
print(A) # [2, 22, 0]
A.pop()
print(A) # [2, 22]
第一个pop 方法的调用删除了44 ,因为它是第二个项目。之后,第二个pop 方法调用删除了最后一个元素,因为pop 方法的默认索引是-1 (最后一个元素)。
另外,你也可以使用remove 方法根据值来删除元素,如下面的代码片断所示。
A = [2, 44, 22, 22]
A.remove(2)
print(A) # [44, 22, 22]
A.remove(22)
print(A) # [44, 22]
正如你可能注意到的,如果你需要删除的值有重复的条目,Python将删除最开始的匹配。
如果你需要一次删除列表中的所有项目,你可以调用clear 方法或者用一个新的空列表重新初始化列表。请看下面的例子。
A = [2, 44, 22, 22]
B = [2, 44, 22, 22]
A.clear()
B = []
print(A) # []
print(B) # []
循环浏览列表
我们经常需要在列表中循环处理或查询项目。Python 有两个循环语句:for 循环和while 循环。你可以使用下面的方法,用for 循环和while 循环来循环一个列表。
用 for-in 循环浏览一个列表
languages = ['Python', 'Go', 'Dart']
for language in languages:
print(language)
上面的迭代很简单,但是你必须创建一个额外的变量来获得当前项的索引,如果你需要的话。
用 for-in-range 循环浏览一个列表
languages = ['Python', 'Go', 'Dart']
for i in range(len(languages)):
print('#' + str(i + 1), languages[i])
这种方法是根据索引在列表中循环,所以你可以使用i 来获得当前项的索引。但是,你总是要写languages[i] 来找到当前的项目。
用while 循环遍历一个列表
languages = ['Python', 'Go', 'Dart']
i = 0
while i < len(languages):
print('#' + str(i + 1), languages[i])
i += 1
基于while 循环的方法与 for-in-range 类似。但是,我们需要明确地增加计数器变量以避免无限循环。
用 for-in-enumeration 循环浏览一个列表
languages = ['Python', 'Go', 'Dart']
for i, language in enumerate(languages):
print('#' + str(i + 1), language)
for-in-enumeration 方式是最安全和最干净的方法,它也可以访问索引来循环浏览一个列表。
对列表进行排序和反转
Python 提供了内置的函数来对列表进行排序和反转。
对一个列表进行排序
你可以使用内置的sorted 函数或sort 方法来对一个列表进行排序。下面的示例代码用sort 对列表A 进行升序排序,用sorted 对列表B 进行降序排序。
A = [2, 33, 1, 0]
B = [22, 3, 0, -2]
A.sort()
print(A) # [0, 1, 2, 33]
B = sorted(B, reverse=True)
print(B) # [22, 3, 0, -2]
反转列表
与列表排序类似,我们可以使用reverse 和reversed 来反转列表。请看下面的示例代码。
A = [2, 33, 1, 0]
B = [22, 3, 0, -2]
A.reverse()
print(A) # [0, 1, 33, 2]
B = list(reversed(B))
print(B) # [-2, 0, 3, 22]
列表切分
Python 提供了一个最小的语法来从现有的列表块中创建新的列表。你不需要使用循环来获取一个列表块的项目。例如,你可以作为一个列表获得前三个元素,如下图所示。
A = [1, 2, 3, 4, 5, 6, 7, 8]
slice = A[0:3] # You can use A[:3] too
print(A) # [1, 2, 3]
下面的例子进一步解释了切分。
A = [1, 2, 3, 4]
print(A[:-1]) # [1, 2, 3]
print(A[2:3]) # [3]
print(A[-1:]) # [4]
print(A[:]) # [1, 2, 3 ,4], same as A.copy()
print(A[:len(A) // 2]) # [1, 2]
带有对象的列表
在前面的例子中,我们已经创建了字符串列表和整数列表。你确实可以按照你的意愿用任何数据类型创建列表。例如,你可以用内置的类实例和用户定义的类实例创建列表。下面的代码生成了一个学生姓名和年龄的列表。
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
students = []
students.append(Student('Mark', 25))
students.append(Student('Emma', 22))
students.append(Student('Jones', 24))
寻找最大值、最小值和总和
Python 提供了最小的内置函数来获取列表的最大、最小和总和。下面的例子演示了如何利用max,min, 和sum 函数。
A = [2, 2, 3, 1]
print('max(A) = ', max(A)) # 3
print('min(A) = ', min(A)) # 1
print('sum(A) = ', sum(A)) # 8
高级 Python 列表概念
在这一节中,我们将讨论多维列表,映射和过滤列表,以及其它高级 Python 列表概念。
N个维度的列表
早些时候,我们创建了单维列表;换句话说,以前的列表是一个元素代表一个唯一的索引,如下图所示。
有时,我们必须创建多维列表,比如为了存储矩阵的细节,我们必须创建一个二维列表结构(一个列表中的列表)。此外,为了存储三维渲染的细节,我们需要一个三维列表结构。
我们可以用下面这个二维列表结构来存储一个简单的矩阵。
可以将上图转换成下面的Python代码片段。
A = [[4, 5], [2, 3]]
print(A) #[[4, 5], [2, 3]]
现在,我们需要使用基于方括号的索引语法两次来获得一个存储值。例如,你需要写A\[0\][1] 来获得值5 。
同样地,你可以根据你的要求创建N-D列表,如3D列表、4D列表等。
映射和过滤
有时,我们需要将列表元素转换为不同的数据类型。例如,我们经常要将字符串列表转换为整数列表。此外,有时我们还必须应用自定义的转换方式。在这些情况下,我们可以使用内置的map 函数,而不使用传统的循环。
让我们用下面的代码将一个用户输入的字符串列表转换成一个整数列表。
A = input('Enter some numbers: ').strip().split(' ')
A = list(map(int, A))
print(A)
当你运行上述代码时,你会看到以下结果。
注意,int 这里是一个函数,而不是一个数据类型。因此,我们可以写一个自定义函数来转换数据元素。看看下面的代码,它将我们所有的列表项乘以2。
A = [1, 2, 3, 4]
def multiply_by_two(x):
return x * 2
B = list(map(multiply_by_two, A))
print(B) # [2, 4, 6, 8]
过滤也可以用来根据一个条件从列表中删除特定的项目。例如,下面的代码删除了所有奇数。
A = [1, 2, 3, 4, 5, 6, 7, 8]
def is_even(x):
return x % 2 == 0
A = list(filter(is_even, A))
print(A) # [2, 4, 6, 8]
内置的filter 函数通过将每个项目发送到is_even 函数,为每个项目调用is_even 。如果我们需要包括给定的项目,我们需要返回True 。因此,如果x 是偶数,is_even 返回True 。
总结
在本教程中,我们用各种实际例子讨论了 Python 列表。Python为基本的列表操作要求提供了内置的方法,如排序、反转、过滤和映射。这些通用的 Python 列表解决方案允许你存储任意元素的列表,但是如果你想只存储数字,以获得更好的性能进行科学计算,NumPy 包的数组结构是一个很好的选择。
值得记住的是,列表并不总是合适的,你还需要学习其他的集合类型。例如,如果你需要创建一个只读的列表,你可以使用内建的元组类型。由于列表允许重复的数据元素,如果你需要制作一个具有唯一数据元素的列表,而不需要通过包装一个列表结构来实现额外的逻辑,你可能反而想使用一个 Python集合。
The postWorking with lists in Pythonappeared first onLogRocket Blog.