关于列表中的差异:列表中的差异 – Python – 语法说明

Difference In List - Python - Syntax Explanation

本问题已经有最佳答案,请猛点这里访问。

有人能解释下一行代码后面的语法的含义吗?

1
temp3 = [x for x in temp1 if x not in s]

我知道这是为了找出两个列表之间的区别,但是"x"在这里代表什么?正在比较的列表中的每个元素?我知道temp1s是列表。另外,x for x必须有相同的变量,还是可以是x for y


1
[x for x in temp1 if x not in s]

稍微重新排序可能会有帮助,这样您就可以从左到右阅读整个内容。让我们把第一个x移到末尾。

1
[for x in temp1 if x not in s yield x]

我添加了一个假的yield关键字,所以它可以自然地作为英语阅读。如果我们再加一些冒号,它会变得更清晰。

1
[for x in temp1: if x not in s: yield x]

事实上,这就是评估的顺序。x变量来自for循环,这就是为什么可以在ifyield子句中引用它。但写清单理解的方式是把收益的价值放在前面。所以最后使用的是一个尚未定义的变量名。

事实上,最后的重写就是如何编写显式生成器函数。

1
2
3
4
def func(temp1, s):
    for x in temp1:
        if x not in s:
            yield x

如果你打电话给func(temp1, s),你会得到一个与列表相当的生成器。你可以用list(func(temp1, s))把它变成那个列表。


它遍历temp1中的每个元素,并检查它是否在s中,然后将其包含在temp3中。

这是一种更短、更具Python般的写作方式。

1
2
3
4
temp3 = []
for item in temp1:
    if item not in s:
        temp3.append(item)

其中,temp1s是您要比较的两个列表。

至于你的第二个问题,江户十一〔六〕行得通,但可能不符合你的意愿,当然也不是很有用。它将把temp1中的每个项赋给变量名y,然后在列表理解之外的范围内搜索x。假设x是先前定义的(否则你将得到NameError或类似的东西),那么if x not in s的条件将对temp1中的每一个项目进行相同的评估,这就是为什么它不太有用的原因。如果该条件为真,则生成的temp3将填充xy值未使用。

不要把这当作是说在列表理解中使用不同的变量永远是没有用的。事实上,像[a if condition(x) else b for x in original_sequence]这样的清单理解通常非常有用。像[a for x in original_sequence if condition(x)]这样的清单理解对于构建一个清单也很有用,该清单包含的a实例与original_sequence中满足condition()的项目数完全相同。


试试你自己:

1
2
arr = [1,2,3]
[x+5 for x in arr]

这应该给您[6,7,8]的值是[1,2,3]列表中的值加上5。这种语法被称为列表理解(或映射)。它对列表中的所有元素应用相同的指令。就像这样:

1
2
for x in arr:
    arr += 5


x是相同的变量,而不是y。它的工作原理与下面的代码相同

1
2
3
4
newList = []
for x in temp1:
   if x not in s:
   newList.append(x)

所以x for x,这里首先是x,它在代码中附加,后面的x与temp1中的x相同。