理解“item for item in list_a if ...” PYTHON

7 投票
4 回答
25671 浏览
提问于 2025-04-17 23:43

我见过下面的代码很多次,知道它能解决我的问题,但我真的很难理解它是怎么工作的。具体的代码是:

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

首先,你提到的那行代码叫做列表推导式。简单来说,这是一种可以“即时”创建列表的方法,同时也可以加上条件。

当你使用列表推导式时,其实是在构建一个列表,你需要告诉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
1

这个列表推导式 [item for item in list_a if item not in list_b] 的意思是,从列表 list_a 中挑选出那些不在列表 list_b 里的项目。其实,这个写法和使用 filter 函数的效果是一样的。

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

你正在通过循环另一个列表来创建一个新列表,并且在这个过程中还会筛选一些内容。

第一个项目就是你要放入结果列表的东西。

你还可以对这个元素进行一些操作,比如:

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

输出结果将会是:

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

简单来说,第一个“项目”让你可以控制你放入结果列表的内容。

8

如果把这个内容分成三个部分,可能会更清楚:

  1. 取出 item
  2. 来自 for item in list
  3. 条件是 item not in list_b

这种列表推导的写法之所以这样,是因为它反映了更详细的写法:

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]

这段代码会创建一个新的列表,里面是所有旧列表中偶数的平方。

撰写回答