理解“item for item in list_a if ...” 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 个回答
首先,你提到的那行代码叫做列表推导式。简单来说,这是一种可以“即时”创建列表的方法,同时也可以加上条件。
当你使用列表推导式时,其实是在构建一个列表,你需要告诉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
这个列表推导式 [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)
你正在通过循环另一个列表来创建一个新列表,并且在这个过程中还会筛选一些内容。
第一个项目就是你要放入结果列表的东西。
你还可以对这个元素进行一些操作,比如:
[i*2 for i in range(6)]
输出结果将会是:
[0, 2, 4, 6, 8, 10]
简单来说,第一个“项目”让你可以控制你放入结果列表的内容。
如果把这个内容分成三个部分,可能会更清楚:
- 取出
item
; - 来自
for item in list
; - 条件是
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]
这段代码会创建一个新的列表,里面是所有旧列表中偶数的平方。