【发布时间】:2016-07-05 02:50:31
【问题描述】:
谁能解释一下下面这行代码背后的语法含义:
temp3 = [x for x in temp1 if x not in s]
我知道这是为了找出两个列表之间的差异,但这里的“x”代表什么?正在比较的列表中的每个单独元素?我知道temp1 和s 是列表。另外,x for x 是否必须具有相同的变量或者可以是 x for y?
【问题讨论】:
谁能解释一下下面这行代码背后的语法含义:
temp3 = [x for x in temp1 if x not in s]
我知道这是为了找出两个列表之间的差异,但这里的“x”代表什么?正在比较的列表中的每个单独元素?我知道temp1 和s 是列表。另外,x for x 是否必须具有相同的变量或者可以是 x for y?
【问题讨论】:
[x for x in temp1 if x not in s]
稍微重新排序可能会有所帮助,这样您就可以从左到右阅读整个内容。让我们将第一个x 移到最后。
[for x in temp1 if x not in s yield x]
我添加了一个假的yield 关键字,所以它自然会读成英文。如果我们再添加一些冒号,它会变得更加清晰。
[for x in temp1: if x not in s: yield x]
真的,这是评估事物的顺序。x 变量来自for 循环,这就是为什么您可以在if 和yield 子句中引用它的原因。但是列表推导式的编写方式是将产生的值放在前面。所以你最终会使用一个尚未定义的变量名。
事实上,这个最终的重写正是您编写显式生成器函数的方式。
def func(temp1, s):
for x in temp1:
if x not in s:
yield x
如果您调用func(temp1, s),您将获得一个与列表等效的生成器。你可以用list(func(temp1, s))把它变成那个列表。
【讨论】:
它遍历temp1 中的每个元素,并在将其包含在temp3 中之前检查它是否不是 在s 中。
这是一种更短、更 Python 的书写方式
temp3 = []
for item in temp1:
if item not in s:
temp3.append(item)
temp1 和 s 是您要比较的两个列表。
至于您的第二个问题,x for y 会起作用,但可能不是您想要的方式,当然也不是非常有用的方式。它将temp1 中的每一项分配给变量名y,然后在列表推导之外的范围内搜索x。假设x 是之前定义的(否则你会得到NameError 或类似的东西),条件if x not in s 将对temp1 中的每个项目评估为相同的值,这就是它不是非常有用的原因。如果该条件为真,则生成的temp3 将填充xs; y 值未使用。
不要认为在列表推导中使用不同的变量是没有用的。事实上,像[a if condition(x) else b for x in original_sequence] 这样的列表推导通常非常很有用。像[a for x in original_sequence if condition(x)] 这样的列表推导式也可以用于构建一个列表,该列表包含的a 实例的数量与original_sequence 中满足condition() 的项目数一样多。
【讨论】:
自己试试吧:
arr = [1,2,3]
[x+5 for x in arr]
这应该给你 [6, 7, 8] 是 [1,2,3] 列表上的值加上 5。这种语法被称为列表理解(或映射)。它将相同的指令应用于列表中的所有元素。和这样做是一样的:
for x in arr:
arr += 5
【讨论】:
X 是同一个变量,它不是 y。它的工作原理与以下代码相同
newList = []
for x in temp1:
if x not in s:
newList.append(x)
所以x for x,这里首先是x,它在代码中的append中,for之后的x与temp1中的x相同。
【讨论】: