不是黄瓜是傻瓜 发表于 2023-9-15 08:30:45

列表推导式的疑问

目的:用a和b生成去掉原点坐标(0, 0)的列表

代码:
a = [-1, 0, 1]
b = [-1, 0, 1]
c = [(x, y) for x in a for y in b].remove((0, 0))
d = [(x, y) for x in a for y in b if (a or b)]
print("c:", c)
print("d:", d)

结果:
c: None
d: [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 0), (0, 1), (1, -1), (1, 0), (1, 1)]

问题:
1.为什么remove((0, 0))不能去掉(0, 0),而清空了整个列表?
2.为什么列表推导式中if(a or b)不能去掉(0, 0)而仍然进行了输出?

isdkz 发表于 2023-9-15 08:30:53

1. 因为列表的remove()方法会直接在原列表上进行删除操作,并且返回值为None。在c中,列表推导式生成的列表并没有赋给一个变量,而是直接在原列表上进行了删除操作,所以最终输出的是None。正确的操作应该是先生成列表,再对列表进行删除操作,如下所示:

a = [-1, 0, 1]
b = [-1, 0, 1]
c = [(x, y) for x in a for y in b if (x, y) != (0, 0)]
c.remove((0, 0))
print("c:", c)


2. 列表推导式中的if语句判断的是(x, y)是否满足条件,而(a or b)判断的是a和b是否有一个为True。所以在d中,if语句的判断条件一直为True,导致(0, 0)也被包含在了列表中。正确的操作应该是将判断条件改为(x, y) != (0, 0),如下所示:

a = [-1, 0, 1]
b = [-1, 0, 1]
d = [(x, y) for x in a for y in b if (x, y) != (0, 0)]
print("d:", d)

不是黄瓜是傻瓜 发表于 2023-9-15 08:40:12

肯定是AI生成的答案,但解决了我的疑问 哈哈

cjjJasonchen 发表于 2023-9-15 09:01:01

{:10_254:}

cjjJasonchen 发表于 2023-9-15 09:01:20

我趣,我是欧皇耶!

wk012233 发表于 2023-9-15 09:17:24

{:9_241:}
页: [1]
查看完整版本: 列表推导式的疑问