列表中的差异 - Python - 语法说明

时间:2016-07-05 02:50:31

标签: python list

有人可以解释以下代码行背后的语法含义:

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

我理解这是为了找到两个列表之间的差异,但'x'代表什么?列表中正在比较的每个元素?我了解temp1s是列表。此外,x for x必须具有相同的变量,还是x for y

4 个答案:

答案 0 :(得分:4)

[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))将其转换为该列表。

答案 1 :(得分:2)

它会遍历temp1中的每个元素,并在s中将其包含在temp3之前检查它是否

这是一种更短更多的pythonic写作方式

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

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

至于你的第二个问题,x for y会起作用,但可能不是你想要的方式,当然也不是非常有用的方式。它会将temp1中的每个项目分配给变量名称y,然后在列表推导之外的范围内搜索x。假设先前已定义x(否则您将获得NameError或类似内容),条件if x not in s将对temp1中的每个项目评估相同的内容,这就是为什么它并不是非常有用。如果该条件为真,则生成的temp3将填充x个; 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()的项目数完全相同。

答案 2 :(得分:-1)

试试自己:

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

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

for x in arr:
    arr += 5

答案 3 :(得分:-2)

X是相同的变量而不是y。它的作用与下面的代码相同

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

所以x for x,这里首先是x,它在内部追加代码,x在for之后与temp1中的x相同。