【问题标题】:Difference In List - Python - Syntax Explanation [duplicate]列表中的差异 - Python - 语法解释
【发布时间】:2016-07-05 02:50:31
【问题描述】:

谁能解释一下下面这行代码背后的语法含义:

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

我知道这是为了找出两个列表之间的差异,但这里的“x”代表什么?正在比较的列表中的每个单独元素?我知道temp1s 是列表。另外,x for x 是否必须具有相同的变量或者可以是 x for y

【问题讨论】:

标签: python list


【解决方案1】:
[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 循环,这就是为什么您可以在ifyield 子句中引用它的原因。但是列表推导式的编写方式是将产生的值放在前面。所以你最终会使用一个尚未定义的变量名。

事实上,这个最终的重写正是您编写显式生成器函数的方式。

def func(temp1, s):
    for x in temp1:
        if x not in s:
            yield x

如果您调用func(temp1, s),您将获得一个与列表等效的生成器。你可以用list(func(temp1, s))把它变成那个列表。

【讨论】:

    【解决方案2】:

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

    这是一种更短、更 Python 的书写方式

    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 将填充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() 的项目数一样多。

    【讨论】:

      【解决方案3】:

      自己试试吧:

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

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

      for x in arr:
          arr += 5
      

      【讨论】:

        【解决方案4】:

        X 是同一个变量,它不是 y。它的工作原理与以下代码相同

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多