Everything you need to get started with lists and list comprehension in Python.
新年即将来临——这是您重新评估自己和回顾过去一年的最佳时机。这也是坐下来写下您计划在来年实现的新年决心清单的好时机。您会把它写在纸上,还是会像其他书呆子一样,拿起笔记本电脑,使用 Excel 或其他工具(如 Python)来保存和维护这份清单?
我们假设您喜欢 Python。在本文中,您将学习如何在 Python 中创建和修改列表。您还将学习如何使用列表推导式构造从已存在的列表中创建列表。
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 列表
列表是可改变的对象
重要的是要知道列表是可更改的 - 您可以在创建列表后添加、删除或更改列表元素。
列表是可改变的对象
例如,如果您想将列表 NewYearResolution 为“减轻压力”,您可以简单地执行以下操作:
NewYearResolution[4]="reduce stress"
我们告诉 Python,第五个元素(索引为 4 的元素)应定义为“reduce Stress”。运行此语句后,我们的列表将被修改,现在如下所示:
修改第五个元素后的列表
在现有列表中插入和删除元素
当然,我们提到过您也可以从列表中添加或删除元素。
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() 函数来精确指定要放置元素的位置。
insert () 函数在特定位置添加元素
例如,如果你想把“健康饮食”这个决议放在第三位,你可以 像这样 insert()
NewYearResolution.insert(2,"eat healthy")
第一个参数是 2,这是您要放置“eat healthy”元素的索引位置。这意味着“eat healthy”将作为列表中的第三个元素显示。
除了插入元素之外,您还可以删除元素。只需使用 remove() 函数即可,如下所示:
NewYearResolution.remove("join gym")
调用此语句后,Python 将永久地从列表中删除“join gym”。
从列表中删除“加入健身房”
遍历列表
添加、删除或更改一个元素很容易,但是当你想对每个列表元素应用一些更改或转换时会发生什么?在这种情况下,你需要遍历整个序列;你可以使用 循环 for 。
循环 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 循环一样。
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 课程。祝您学习愉快,并祝您在使用列表和列表推导时好运!
发表评论 取消回复