有人可以解释以下代码行背后的语法含义:
temp3 = [x for x in temp1 if x not in s]
我理解这是为了找到两个列表之间的差异,但'x'代表什么?列表中正在比较的每个元素?我了解temp1
和s
是列表。此外,x for x
必须具有相同的变量,还是x for y
?
答案 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)
temp1
和s
是您要比较的两个列表。
至于你的第二个问题,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相同。