【问题标题】:Python understanding list comprehension from Java background [duplicate]来自Java背景的Python理解列表理解[重复]
【发布时间】:2015-12-02 06:00:44
【问题描述】:

我来自 Java 背景,刚刚开始使用 Python。大多数事情都相当容易掌握,但我很难用我刚刚发现的语言理解一件事,那就是列表理解。 Python 中的列表理解 是什么?这与 Java 中的语言结构相比如何?问题是它无处不在,我在这里和那里找到的几乎所有示例都使用它。

对于以下示例,请允许我了解其工作原理。

[x**2 for x in range(10)]

然后就是这个。

[j + k for j in 'abc' for k in 'def']

除此之外,我还在 Stackoverflow 的某个地方看到过类似的事情。

(x for x in (0,1,2,3,4))

还有这样的事情。

total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)

这开始变得一团糟,你能帮帮我吗?

【问题讨论】:

  • 你试过在你的 python shell 中运行这些吗?列表推导式是一种生成列表的方式。
  • 您到底对什么感到困惑?当您在[] 中有这种类型的表达式时,它是一个“列表理解”,在{} 中是一个“字典理解”,在() 中是一个“生成器表达式”,但它们的工作方式都相似,只是最后的类型不同。
  • 如果您没有开始学习新语言,您可能很容易说,但我已经检查了其他答案。我真的很想明白这一点:(
  • 这有点烦人,我写了一个很长的答案,从 Java 的角度解释了它是如何工作的,但是在我发布之前它就关闭了。 Python 和 Java 对这类问题的处理方式截然不同。
  • 不能再同意了。我们应该更受欢迎,否则#SOreadytohelp 标签就没有多大意义了,对吧?

标签: python


【解决方案1】:

Python 中的列表推导是什么?

首先让我们从官方 Python 文档中的基本定义开始。

列表理解由包含表达式的括号组成,后跟 for 子句,然后是零个或多个 forif 子句。结果将是一个新列表,该列表是通过在其后的 forif 子句的上下文中评估表达式而产生的。

问题是它无处不在,我在这里和那里找到的几乎所有示例都使用它。

列表理解是一个非常灵活的概念。它允许我们定义我们从数学中知道的列表。假设我们有一个集合S,其中S 的每个元素都是数字x 的平方,而x 只能接受从010 的值。

见上面的定义。用一段话来描述它。但是有更好的方式来描述它。

S = {x² : x in {0 ... 10}}

这就是我喜欢数学的原因,它总是切中要害。现在还记得你的第一个例子吗?

S = [x**2 for x in range(10)]

这就是我们刚刚定义的集合。整齐吧?这就是它被如此广泛使用的原因。 (不要与 x**2 语法混淆,因为 Python 在这里遵循一种奇怪的语法,您可能对其他语言的 x^2 很熟悉。)

在 Python 中,您几乎可以迭代任何东西。这基本上意味着您可以轻松地遍历字符串的每个字符。我们来看第二个例子。它只是遍历单词‘abc’‘def’ 并从中创建一个列表。

lst = [j + k for j in 'abc' for k in 'def']

请注意,我们已将其分配给名为 lst 的列表。这不是巧合。 Python 是我见过的最人性化的编程语言。所以当你遇到困难时她会帮助你。像这样。

help(lst)

您现在可以看到使用lst 可以做什么。曾经对lst 是什么感到困惑吗?你可以通过type查看它是什么。

print type(lst)

在我们继续之前,让我们先谈谈迭代器生成器

迭代器是可以调用next() 方法的对象。像这样。

iterator = iter([1,2,3,4])

现在我们可以像这样打印迭代器的第一个元素。

print iterator.next()

现在我们可以谈谈生成器了。它们是生成迭代器的函数。然而,还有另一个概念称为生成器表达式

(x for x in (0,1,2,3,4))

这是一个生成器表达式。生成器表达式就像使用类似于列表推导式的表达式构建生成器的捷径。

total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)

上面一行的作用是首先使用生成器表达式创建一个生成器,然后遍历每个元素并对这些元素求和。

【讨论】:

  • 天啊。非常感谢!
  • 另请注意,Python 在这里使用的“奇怪语法”是因为 ^ 是位运算符。事实上,在许多语言中都是如此。 ** 只是 math.pow(x, y) 的一个方便的运算符。
  • 感谢您的注意,这绝对是一个很好的评论,以供将来参考此问题。
  • 我实际上是想看看其他语言在这里做了什么。我知道 C/C++/Java 根本没有运算符,只有一个等效于 Python 的 pow 的函数。 Some languages 显然提供了^^(同样的原因;按位区分^)并且只有BASIC 似乎与^ 成幂。
  • 哇,我认为它更常见,但如果是这种情况,我认为我应该删除该声明。我不想误导任何人:)
猜你喜欢
  • 2011-06-15
  • 2021-04-20
  • 2021-10-06
  • 2018-06-24
  • 2018-03-20
  • 2017-02-27
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多