Everything you need to get started with lists and list comprehension in Python.

新年即将来临——这是您重新评估自己和回顾过去一年的最佳时机。这也是坐下来写下您计划在来年实现的新年决心清单的好时机。您会把它写在纸上,还是会像其他书呆子一样,拿起笔记本电脑,使用 Excel 或其他工具(如 Python)来保存和维护这份清单?

我们假设您喜欢 Python。在本文中,您将学习如何在 Python 中创建和修改列表。您还将学习如何使用列表推导式构造从已存在的列表中创建列表。

New-Year's Resolution

Python 中的列表和列表创建:基础知识

Python 中最著名和最常用的集合对象或序列之一是列表。在 Python 中,列表可以是字符串集合(如新年决心列表)或数字集合(如去年每个月的体重列表)。列表也可以更复杂,例如其他对象的集合。您甚至可以创建其他列表的列表。

以下是字符串列表的一个示例。请注意它在 Python 中是如何创建的:

NewYearResolution = ["stop smoking", "lose weight", "join gym", "find a new job","enjoy life"]

在我们的示例中,“NewYearResolution”是列表名称。此列表中的每个元素都是一个字符串。在方括号 [ ] 内,列表元素被定义并用逗号分隔。我们的列表有 5 个决议(即它是一个包含 5 个元素的列表)。每个决议(元素)都用数字(0、1、2、3 或 4)索引。第一个元素“戒烟”的索引为 0,可以使用命令 NewYearResolution[0] 。第二个元素“减肥”的索引为 1,可以使用 NewYearResolution[1] ,依此类推。最后一个元素“享受生活”可以使用 NewYearResolution[4] .

这是如何在 Python 中创建列表并访问每个列表元素的方法。如果您不熟悉列表和其他 Python 对象,并且想要做更多学习,请查看 为 Python 初学者提供的交互式在线课程:

  • Python 基础知识 - 第 1 部分
  • Python 基础知识 - 第 2 部分
  • Python 基础知识 - 第 3 部分

Python 数据结构课程 讲解 了 Python 的数据结构(包括列表);这对于您在掌握基本的 Python 技能之后的下一步学习可能会很有帮助。

Python Data Structures

使用 Python 列表

列表是可改变的对象

重要的是要知道列表是可更改的 - 您可以在创建列表后添加、删除或更改列表元素。

Lists are changeable objects

列表是可改变的对象

例如,如果您想将列表 NewYearResolution 为“减轻压力”,您可以简单地执行以下操作:

NewYearResolution[4]="reduce stress"

我们告诉 Python,第五个元素(索引为 4 的元素)应定义为“reduce Stress”。运行此语句后,我们的列表将被修改,现在如下所示:

修改第五个元素后的列表

在现有列表中插入和删除元素

当然,我们提到过您也可以从列表中添加或删除元素。

Inserting and removing elements from an existing list

append () 函数将元素添加到列表末尾

如果您想向 NewYearResolution 来实现 append()

NewYearResolution.append("get more sleep")

现在,如果你输入 NewYearResolution ,Python 将在输出屏幕中返回以下内容:

['stop smoking', 'lose weight', 'join gym', 'find a new job', 'reduce stress','get more sleep']

在最后一个位置添加一个元素

您可能已经注意到,新解决方案位于列表的最后一个位置。append () 函数始终会附加一个元素,或将其添加到末尾。如果您不想将新元素放在最后一个位置,则可以使用 insert() 函数来精确指定要放置元素的位置。

Adding an element to the last position

insert () 函数在特定位置添加元素

例如,如果你想把“健康饮食”这个决议放在第三位,你可以 像这样 insert()

NewYearResolution.insert(2,"eat healthy")

第一个参数是 2,这是您要放置“eat healthy”元素的索引位置。这意味着“eat healthy”将作为列表中的第三个元素显示。

除了插入元素之外,您还可以删除元素。只需使用 remove() 函数即可,如下所示:

NewYearResolution.remove("join gym")

调用此语句后,Python 将永久地从列表中删除“join gym”。

Removing

从列表中删除“加入健身房”

遍历列表

添加、删除或更改一个元素很容易,但是当你想对每个列表元素应用一些更改或转换时会发生什么?在这种情况下,你需要遍历整个序列;你可以使用 循环 for

Flow diagram of a for loop from the list

循环 for 的流程图

下面是一个示例,说明如何使用 列表 NewYearResolution for

for resolution in NewYearResolution:
     print(resolution)

我们正在遍历整个列表并将每个元素的内容打印到输出控制台。我们使用现有列表并对每个元素应用 print() 命令。在这种情况下,我们没有创建列表或更改任何列表元素 — 我们只是遍历整个列表并打印出内容。

我们还可以使用 for 循环根据现有列表创建列表。让我们通过一个简单的示例,使用 2019 年收入最高的演员名单。以下是列表:

highest_paid_actors = ["Will Smith", "Paul Rudd" ,"Chris Evans" ,"Adam Sandler" ,"Bradley Cooper","Jackie Chan" ,"Akshay Kumar" ,"Robert Downey Jr." ,"Chris Hemsworth" ,"Dwayne Johnson" ]

现在我们来看看他们的出生日期。(他们中有的还不到40岁就已经赚得盆满钵满!)

highest_paid_actors_birthdate = ["25.9.1968","6.4.1969","13.6.1981","9.9.1966","5.1.1975","7.4.1954","9.9.1967","4.4.1965","11.8.1983","2.5.1972"]

假设我们要从每个演员的出生日期中提取年份,并将其保存在另一个名为 highest_paid_actors_birthyear 。以下是 执行此操作的 for

import datetime
highest_paid_actors_birthyear=[]
for birthdate in highest_paid_actors_birthdate:
     birthdate_year = datetime.datetime.strptime(birthdate,"%d.%m.%Y").year
     highest_paid_actors_birthyear.append(birthdate_year)

我们首先初始化一个名为 highest_paid_actors_birthyear

We first initialized an empty list named highest_paid_actors_birthyear:

然后我们使用 for 循环遍历整个序列。对于每个出生日期,我们运行一条语句,将出生日期字符串转换为日期时间(包含日期和时间信息的数据类型)并提取年份:

datetime.datetime.strptime(birthdate,"%d.%m.%Y").year

函数 strptime() datetime datetime 。因为我们要处理日期并需要这些函数,所以我们首先导入 datetime 模块来访问它们。然后我们就可以使用这些函数了。

年份 值存储在 变量中,然后将其附加到名为 birthdate_year highest_paid_actors_birthyear 。 运行此for循环后,我们新创建的列表 highest_paid_actors_birthyear 如下所示:

[1968, 1969, 1981, 1966, 1975, 1954, 1967, 1965, 1983, 1972]

2019 年收入最高的演员的出生年份

Python 中的列表推导

上一个示例展示了如何使用 for 循环从另一个列表创建一个列表。但是,我们可以使用另一种方法,称为“列表推导”。这是一种创建列表的优雅方法,同时避免了 for 循环构造。使用列表推导,只需一行代码即可创建一个新列表;这使 Python 代码更易于阅读和维护。

因此,我们不需要创建一个空列表并将每个元素添加到末尾,而是可以在同一语句中通过使用列表推导来初始化列表及其内容。

在 Python 中,列表推导的语法如下:

[ expression for item in a list {if condition_is_met} ]

列表推导式定义在方括号 [ ] 内。这提醒我们结果对象肯定是一个列表。

括号内 定义了 表达式 for item in a list ”,我们定义了要迭代的序列。我们还可以在括号内定义一个 if 条件语句,以从现有列表中筛选元素。

现在我们知道了什么是列表推导,我们可以轻松地重写上 一个例子中的 for

import datetime
highest_paid_actors_birthyear=[]
for birthdate in highest_paid_actors_birthdate:
    birthdate_year = datetime.datetime.strptime(birthdate,"%d.%m.%Y").year
    highest_paid_actors_birthyear.append(birthdate_year)

...变成这样:

import datetime
highest_paid_actors_birthyear = [datetime.datetime.strptime(birthdate,"%d.%m.%Y").year for birthdate in highest_paid_actors_birthdate]

中的几行代码 for 在列表推导中不存在。首先,使用列表推导,我们不需要初始化空列表,即我们不需要语句 highest_paid_actors_birthyear=[] .

使用 append() 告诉 Python 每个新元素都应该添加到末尾也是不必要的;我们不需要在列表推导中使用 append() 。相反,我们只是定义变量 highest_paid_actors_birthyear 并将列表推导结果赋给该变量。

在我们的示例中, 表达式 定义为:

datetime.datetime.strptime(birthdate,"%d.%m.%Y").year

这适用于列表 highest_paid_actors_birthdate 。此语句 返回每个出生日期的年份 ,并将结果存储在名为 highest_paid_actors_birthyear .

这样写的代码更容易理解。这就是为什么列表推导非常著名并且深受 Python 程序员的欢迎。

请记住,我们还可以使用带有列表推导的条件 if 语句。我们使用 if 来仅选择符合定义条件的某些元素。以下是一个例子:

[birthyear for birthyear in highest_paid_actors_birthyear if birthyear>1970]

这里有 if 语句 if birthyear>1970 。这意味着 Python 只会从列表 highest_paid_actors_birthyear 大于 1970 的元素(出生年份)。只有这些元素才会运行表达式,这意味着 Python 将返回一个经过筛选的列表。

结果将是一个包含四个元素的列表,代表 2019 年收入最高的演员的出生年份 - 但仅限于这些演员出生于 1970 年以后:

[1981, 1975, 1983, 1972]

条件语句的 if 列表推导

列表推导作为 Map()

列表推导可以替换 map() 语句,就像它替换 for 循环一样。

 Flow diagram of a for loop from the list

map () 语句将函数应用于序列的每个元素

当我们想将一个函数应用于列表中的每个元素时,可以使用 Map()

def calc_age(x):
      return datetime.date.today().year — x
actors_ages = map(age, highest_paid_actors_birthyear)
list(actors_ages)

在这段代码的开头,我们定义了函数 calc_age() 。通过调用此函数,Python 将获取出生日期年份并返回一个人的年龄。计算方法是将当前年份减去出生年份。现在我们有了 calc_age() 函数,我们可以使用 map() 将该函数应用于 highest_paid_actors_birthyear

map(calc_age,highest_paid_actors_birthyear)

Map() 返回一个映射对象 ( actors_ages )。如果我们想查看内容(我们也确实想查看),我们需要应用 list() 函数 ( list(actors_ages ) )。

现在让我们看看当我们使用列表推导而不是 map () 语句时它是什么样子:

def calc_age(x):
return datetime.date.today().year — x
actors_ages = [calc_age(birthyear) for birthyear in highest_paid_actors_birthyear]

在方括号 [ ] 内,我们的表达式定义为 calc_age(birthyear) 。 forbirthyear in highest_paid_actors_birthyear 部分告诉我们想要迭代的序列。

相同的结果 map() ,并且只需要函数定义之外的一行代码。

我们学到了什么关于 Python 列表和列表推导的知识?

  • 列表是一个或多个元素的序列。在 Python 中,列表是通过将所有元素放在方括号内来创建的。列表项用逗号分隔。
  • 列表是可更改的对象。创建列表后,我们可以添加、删除或更改元素。
  • 列表是有序且有索引的,这意味着每个元素都被分配一个数字,以指示其在序列中的位置。索引为 0 的元素是列表中的第一个元素,索引为 1 的元素是第二个元素,依此类推。
  • 当我们想要遍历整个列表并将代码语句应用于每个元素时,我们可以使用 for 循环或 map() 函数。
  • 循环和 for 的优雅替代方案 map() 。它允许我们用很少的代码迭代列表并从现有列表创建新列表。

在本文中,我们了解了列表语法、列表推导语法,以及为什么使用列表推导而不是 map() for 循环更好。如果您想了解有关 Python 列表的更多信息,我建议您参加 Python 课程。祝您学习愉快,并祝您在使用列表和列表推导时好运!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部