Python 中的数据结构:列表和复仇者联盟
我的个人博客上也有这篇文章,链接在此。
介绍
好了,我看了《复仇者联盟3:无限战争》,太棒了!剧情震撼、荒诞,还让我哭了。别担心,虽然会有一些剧透,但我会提前提醒。我打算借用一些复仇者联盟的例子来讲解Python的数据结构。我对Python的所有数据结构并不十分熟悉。为了挑战自己,我制定了一个计划,深入研究Python中的各种数据结构。本系列的第一篇将介绍Python列表。
数据结构是存储和处理数据的方法。由于 Python 是一种比 C 语言更高级的语言,因此我们无需考虑内存管理和垃圾回收。不过,创建类似列表这样的数据结构确实会通过索引过程分配内存地址。我们稍后会详细讨论这一点。
原始数据结构与非原始数据结构
让我们来看看Python是如何对数据进行分类的。原始数据结构是指编程语言本身处理的数据结构,例如Python中的整数、浮点数和字符串。它们也被称为数据类型。非原始数据类型指的是Python中我们自己创建的数据结构,例如列表、元组、集合和字典。这些结构是由程序员创建的。因此,当我们为这些结构建立索引并将内存地址分配给列表中的条目时,就涉及到了内存地址的问题。Python几乎不会直接暴露内存地址,对于高级语言来说,你通常不需要考虑内存地址。然而,在我看来,了解编程语言的底层机制仍然非常重要。
列表介绍
列表是一种将值存储在列表中的方法,可以通过索引来访问每个值。以下是一个列表示例:
list = [1,2,3]
print (list)
现在我们运行列表
[1, 2, 3]
我们的列表是一组数字,每个数字都有自己的索引。我们可以列出一系列值,例如姓名、日期、价格等等。列表有很多应用,例如,我们可以用一组字符串来记录加入复仇者联盟的英雄。以下是第一部电影中复仇者联盟的首批成员名单。
avengers = ['Iron Man','Captain America','Black Widow','The Hulk','Hawkeye','Thor', 'Falcon']
print ("Hero List example: ")
print (avengers)
然后我们运行代码,得到:
Hero List example:
['Iron Man', 'Captain America', 'Black Widow', 'The Hulk', 'Hawkeye', 'Thor', 'Falcon']
如上所示,我们可以将列表打印成一个单独的列表。我们还可以使用 for 循环逐个遍历列表。通常,如果我们要对这个列表进行任何操作(例如在屏幕上打印、添加到数据库),我们都会使用 for 循环来遍历列表。
print ("For Loop Example: ")
for x in avengers:
print (x)
然后我们运行代码:
For Loop Example:
Iron Man
Captain America
Black Widow
The Hulk
Hawkeye
Thor
Falcon
堆叠
列表的用途非常广泛。我们甚至可以对列表进行“堆叠”。遵循后进先出(LIFO)原则,我们可以使用 append 和 pop 函数来添加或移除列表中的成员。看过《美国队长3:内战》的观众可以看到,阵容中新增了两位英雄。
avengers.append('Black Panther')
print ("Append Example: ")
for x in avengers:
print (x)
这给我们带来了
Append Example:
Iron Man
Captain America
Black Widow
The Hulk
Hawkeye
Thor
Falcon
Black Panther
我们都知道黑豹是谁。他要治理国家,没时间待在复仇者联盟基地里坐等灾难发生。特查拉加入复仇者联盟后,必须尽快退居幕后,在他父亲去世后继承瓦坎达国王的职位。
avengers.pop()
print ("Pop Example: ")
for x in avengers:
print (x)
由此可得:
Pop Example:
Iron Man
Captain America
Black Widow
The Hulk
Hawkeye
Thor
Falcon
堆叠操作就是这样。`append` 方法会在列表末尾添加一个条目。`pop` 方法会从列表中移除一个条目。`pop` 方法的不同之处在于,你可以指定要移除的值的索引(位置),它会移除该值。如果留空,`pop` 函数会移除列表中的最后一个条目。
索引
索引是用来跟踪列表中值及其顺序的方法。从零开始向上计数,就能得到条目的位置。以黑寡妇为例。除了早就应该有一部她的个人起源电影之外,我们还需要找到她在列表中的位置。
print (avengers.index('Black Widow'))
将该命令输入到 Python 解释器中,即可得到列表中的第 2 个或第三个位置。
2
更佳价值管理
所以,第一个意识到他们对复仇者联盟没那么感兴趣的是美国队长。假设我们不知道 pop 函数的工作原理,也不知道美国队长在列表中的位置,我们可以使用 remove 函数将其移除。
avengers.remove('Captain America')
print ("Remove Example: ")
for x in avengers:
print (x)
该函数查找并删除指定的条目。如果该值不存在,则会返回错误。
Remove Example:
Iron Man
Black Widow
The Hulk
Hawkeye
Thor
Falcon
Black Panther
由于美国队长和钢铁侠退出,我们把黑豹招入了复仇者联盟。然而,钢铁侠还需要另一个人帮忙,才能把罗杰斯队长和他的伙伴们重新拉回阵营。这时,电影版蜘蛛侠出现了。让我们把他加到名单里。假设我们想让蜘蛛侠成为复仇者联盟的新面孔,所以我们想把他放在名单的首位。我们可以使用插入函数来实现这一点。这里我们传入的是值出现的索引位置和值本身。
avengers.insert(0, 'Spider Man')
print ("Insert Example: ")
for x in avengers:
print (x)
如果我们再打印一遍名单,就会发现蜘蛛侠位列榜首。我对此很满意。汤姆·赫兰德饰演的蜘蛛侠/彼得·帕克非常出色。
Insert Example:
Spider Man
Iron Man
Captain America
Black Widow
The Hulk
Hawkeye
Thor
Falcon
Black Panther
有多少个蜘蛛侠?
所以漫画宇宙里有十几个不同的蜘蛛侠版本。有彼得·帕克版的蜘蛛侠,我最喜欢的迈尔斯·莫拉莱斯版蜘蛛侠,还有超棒的蜘蛛格温。漫威电影宇宙(MCU)目前只有一个蜘蛛侠。不过,为了保险起见,我们还是来统计一下名单上的蜘蛛侠数量吧。
我们可以使用 count 函数来统计列表中某个值出现的次数。
how_many_spider_mans = avengers.count('Spider Man')
print ("Count Example Example: How Manny Spider Men are there?")
print (how_many_spider_mans)
漫威电影宇宙(MCU)只有一个蜘蛛侠角色,所以我们的列表中也只有一个蜘蛛侠数值。因此,我们得到的结果是1。
Count Example Example: How Manny Spider Men are there?
1
嵌套
我们都非常喜欢第一部《银河护卫队》。精彩的视觉效果、幽默风趣的对话,当然还有那恰到好处的70年代音乐与太空冒险的融合。他们在漫威宇宙中独立于地球上的复仇者联盟之外。然而,在《复仇者联盟3:无限战争》中,他们齐聚一堂,贡献了漫威电影宇宙中最精彩的一些对话。我们已经列出了地球上的英雄名单。现在,又一支酷炫的队伍加入了他们的行列。那么,让我们来创建新的名单吧。
gotg = ['Star Lord', 'Rocket', 'Groot', 'Drax', 'Gamora']
现在我们有了新的列表,需要想办法把它们添加到复仇者联盟的列表中。Python 的嵌套列表可以帮我们解决这个问题。Python 列表允许你在列表中嵌套其他列表。这有很多用途。例如,将相关信息放在一个列表中就是一个很好的例子。不过,在那个特定例子中,使用类可能更好。稍后会详细介绍。现在,让我们把银河护卫队添加到复仇者联盟的列表中。
avengers.append(gotg)
print ("Append Nested List Example: ")
for x in avengers:
print (x)
打印出名单后,我们发现名单上不仅有银河护卫队成员,还有其他复仇者联盟成员。干得漂亮,凯文·费奇!
Append Nested List Example:
Iron Man
Captain America
Black Widow
The Hulk
Hawkeye
Thor
Falcon
Black Panther
['Star Lord', 'Rocket', 'Groot', 'Drax', 'Gamora']
前方剧透预警!!
友情提示:如果你还没看过《复仇者联盟3:无限战争》,请跳过这段。这是个非常重要的结局,如果你对这部电影有任何兴趣,请直接跳到结尾。警告完毕。
说真的,前面有剧透。而且是相当劲爆的剧透。
好了,我已经警告过你们了。看过《复仇者联盟3:无限战争》的人都知道结局。太令人心碎了。我当时完全懵了,现在还在消化。在结尾,大部分复仇者都牺牲了。虽然不是全部,但确实有不少。所以现在我们需要更新一下复仇者联盟的成员名单。我们可以使用清除功能来清空名单,因为他们中的大多数已经不在了。名单上的一些成员仍然在漫威电影宇宙中,但是用电影结尾的结局来处理更符合我们的需求。
avengers.clear()
print ("Clear Example: ")
print (avengers)
哪些打印机
Clear Example:
[]
现在我们打印出来的片单是空的。我到现在都还没缓过来。通常来说,这类电影的情感冲击力远不如《黑豹》之类的电影。但自从《黑豹》上映后,情况就发生了变化。《黑豹》以一种细腻而引人入胜的方式探讨了宏大而复杂的主题。我很期待看到电影如何继续提升标准。
结论
我希望与复仇者联盟的合作能帮助大家更好地理解列表的用法,以及如何在 Python 程序中使用列表。这种数据结构有很多不同的应用场景。然而,在某些情况下,列表虽然适用,但其他数据结构可能更合适。我们将在本系列的后续章节中探索其他数据结构。我很期待我们能取得怎样的成果。
完整的源代码可以在这里找到:https://github.com/georGEO1989/Data-Structures-Lists
文章来源:https://dev.to/georgeoffley/data-structs-in-python-lists-and-the-avengers-305f