Python中的列表理解

Python中的列表理解

列表是使用任何语言的开发人员的基本构建块。 Python也不例外。 但是,起初,列表理解有时会令人困惑。 由于它不是所有语言都可用的功能,因此它可能也是一个完全不熟悉的概念。 包括列表理解的一些流行语言是JavaScript,Perl 6,C#,当然还有Python。 今天,我们将看看Python中列表理解的工作原理。 在本文中,我们将介绍以下概念:

  1. 什么是列表理解?
  2. 列表理解的优点是什么?
  3. 列表理解可以使用哪些方式?
  4. 列表理解的一些常见示例是什么?
  5. 与其他方法相比,何时应使用列表理解?

什么是列表理解?

在最基本的层次上,列表理解是从现有列表创建列表的语法结构。 此定义描述了我们稍后将讨论的一些用途。 如果我们不需要创建新列表,而仅打印现有列表中的结果,那么列表理解对我们实际上就没有帮助。 在Python中,有很多创建列表的方法。

如果我们想创建一个空列表,可以这样声明:

listA = []

或者,如果我们想创建一个包含值的列表,则可以这样进行:

listB = [1,2,3,4]

如果我们想创建一个包含10个项目的列表,每个项目具有相同的值,我们还可以执行以下操作:

listB = [1]*10
# which would give us the following output:
>>listB
>>1,1,1,1,1,1,1,1,1,1

创建列表的另一种方法是遍历现有列表,并将第一个列表中的数据追加或插入到第二个列表中。

看起来可能如下所示:

listA = []
listB = [1,2,3,4,5,6]
for number in listB:
if number % 2 == 0:
listA.append(number)

在这里,我们遍历listB,如果列表中的当前值为偶数,则将其附加到listA。 在这种情况下,我们可能会使用列表推导。 首先,让我们考虑上述标准循环的语法,并将其与相同概念的语法进行比较,但使用列表推导。

for循环的语法:

 for item in list:
if conditional:
expression

等效于以下列表理解:

[ expression for item in list if conditional ]

表达式是说“输出”的一种奇特的方式。 因此,在每种情况下,输出都是执行某些代码的结果。 在我们之前的示例中,输出将某些内容追加到新列表中。

同样在传统的for循环和列表理解中,我们都有要迭代的列表,列表中的项目或可迭代的对象以及条件语句。

让我们仔细看看for循环的语法:

在Python for循环中,我们将开始循环,并在必要时使用条件语句,然后执行代码块。 在上面的示例中,我们可以看到它是如何工作的以及预期的输出。

这是我们可以通过列表理解来重写同一段代码的方法:

在这里,我们可以看到我们在for循环中使用的所有相同构建基块仍然存在于列表推导中,尽管顺序有所不同。

列表理解的优点

这将我们带入下一个主题,即列表理解的优势。 上面的示例虽然不如for循环那么麻烦,但仍可以合并为更简洁的格式。 列表理解的一大优点是,它们使开发人员可以编写更少的代码,而这些代码通常更易于理解。

这是我们可以进一步简化以上示例的方法:

在这里,我们采用了原始的三行代码,并将其简化为易于阅读的单行代码。

其他优点:

列表理解通常更快,但只有在实际用于创建新列表时才如此。 如果您注意到,在第一个示例中,我们在for循环中包括了append方法,但是当我们完全合并我们的代码时,我们将append方法完全排除在列表理解范围之外。 这是因为在Python中,我们不需要从列表中加载append属性并将其作为函数调用。 相反,在理解中,将生成专门的LIST_APPEND字节码,以便快速追加到结果列表中。

在第一个示例中,必须在循环的每次迭代中调用append()方法。 这意味着,如果我们的循环进行了一百万次迭代,则append()方法将被调用一百万次,这明显比列表理解要慢。

如何使用列表理解?

上面的示例可以称为过滤器功能。 我们正在获取一个现有列表,并过滤该列表以创建一个新列表。 在这种情况下,要从序列中获得奇数或偶数,但是对于其他过滤方案(如生成斐波那契序列)也可以做到这一点。

以下是一些我们可能使用列表理解的方法的示例:

  1. 过滤现有列表。
  2. 生成数据列表
  3. 展平多维列表

我们已经看到了一个示例,说明如何使用列表推导将一个列表的结果过滤到新列表中。 现在,让我们看看如何使用它来生成数据列表。

在上一篇文章中,我们研究了如何使用python确定贷款的复利。

在下面,我们将生成一个字典列表,每个字典都包含一个具有不同本金值和最终值的贷款。 每个字典中的最终值将由我们根据确定复利的公式得出的初始值来确定。 该公式和字典生成将存储在其自己的函数中,但是在循环和列表理解中,我们将基于循环中的一系列数字来调用该函数。

让我们先来看一下for循环:

每次for循环在我们设置的范围内迭代一个数字时,它将调用newDict函数,并将该函数的结果附加到我们的newList中。 如果打印结果,则应该看到一列字典,每个字典包含一组唯一的数据。

如果我们使用列表理解来重写它,我们可以再次避免使用append方法,从而在如此大的数据集上节省了宝贵的资源。

如下所示:

最后,让我们看一下如何在Python中使用列表理解来扁平化多维列表。

如果要使用for循环执行此操作,则可能需要是嵌套循环,类似于以下内容:

如果我们有一个名称列表列表,并且需要将它们快速拼凑成一个列表,我们可以在这里看到如何方便。

使用列表理解重写此代码如下所示:

什么时候应该使用列表理解?

前面我们讨论了列表理解的优点之一。 这样做的好处是,我们不需要使用append()方法来创建新列表。 列表理解非常适合创建新列表,原因有很多:

  1. 代码更简洁
  2. 该代码通常更具可读性
  3. 在大多数情况下,代码将运行得更快

但是,这可能并不总是需要的。 在某些情况下,我们可能只需要在迭代列表时打印列表的结果。 在这种情况下,列表理解没有明显的优势。 实际上,到那时,我们最终会使用不必要的内存来创建不需要的列表。 在确定列表理解是否比循环更好的选择时,我们可以简单地问自己:“我要创建一个新列表吗?”

如果答案是“是”,则列表理解可能是首选方法。 如果不是这样,那么比老式的for循环更好。

感谢您的阅读,如果您有任何反馈意见,我想听听。 谢谢!

From: https://hackernoon.com/list-comprehension-in-python-c762ba1f523f

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值