理解" list_a中项目的项目,如果..."蟒蛇

时间:2014-03-24 20:38:06

标签: python

我已经多次看过以下代码了,我知道这是我的问题的解决方案,但我真的很难理解它是如何工作的。代码特别是:

item for item in list_a if item not in list_b.

例如,使用for each in list,我可以理解它是通过列表,并为该列表中的每个项目执行循环。使用while x < 10很容易理解,大多数其他循环和类似命令都非常简单。即使是for item in list_a if item not in list_b对我来说也是有道理的,尽管如果没有那个item,这似乎没有用......但由于某种原因,我只是不明白第一个item除了“因为”(这不是一个有用的答案),它代表的是什么。

有人能够帮助我解决这个问题,或者能够将这个等式扩展到几个方程式中,这可能有助于我了解它的工作方式。当我理解它们是如何工作的时候,我会更容易使用这些工具,而这些工具让我困惑了一段时间。

提前致谢。

4 个答案:

答案 0 :(得分:3)

如果将它分成三部分可能会更清楚:

  1. 选择item;
  2. 来自for item in list;
  3. item not in list_b
  4. 列表理解语法之所以如此,首先是因为它反映了扩展版本:

    for item in list: # 2.
        if item not in list_b: # 3.
            new_list.append(item) # 1.
    

    并且因为您不一定只想要item,例如:

    new = [x ** 2 for x in old if not x % 2]
    

    将在new中创建一个old列表,其中包含所有偶数的平方。

答案 1 :(得分:0)

列表推导[item for item in list_a if item not in list_b]等同于使用filter函数:

filter(list_a, lambda item: item not in list_b)

答案 2 :(得分:0)

首先,您所指的代码行称为列表推导。基本上,正如您所知,它是一种“随时随地”创建项目列表的方法,同时具备条件的能力。

当您创建列表推导时,您正在构建一个列表,并且您需要告诉Python您在该列表中添加了什么。如果列表理解只是:

new = [for item in list_a if item not in list_b]

它根本不是列表理解,因为你只是迭代而不是在新列表中存储任何东西。因此,为了将项目实际保存到新列表中,您需要:

new = [item for item in list_a if item not in list_b]

# for each item in 'list_a', if 'item' is not in 
# 'list_b', add item to 'new'

与以下内容相同:

i = 0
for item in list_a:
    if item not in list_b:
        new[i++] = item

将“首先item”视为您放入列表的值。本质上,列表理解枚举,跟踪索引并为每次迭代执行类似的操作:

new[index] = item

答案 3 :(得分:-1)

您正在通过循环(并过滤)另一个列表来构建列表

第一项是你要放入结果列表的东西

您还可以对元素执行操作,例如

[i*2 for i in range(6)]

输出将是:

 [0, 2, 4, 6, 8, 10]

基本上是第一个&#34;项目&#34;允许您控制您在结果列表中添加的内容