【发布时间】:2021-01-17 01:30:59
【问题描述】:
test_list = [(1, 4, 6), (5, 8), (2, 9), (1, 10)]
tar_list = [6, 10]
从测试列表中保留包含任何目标列表元素的元组:
Filtered tuple from list are : [(1, 4, 6), (1, 10)]
我完成上述简单任务的代码:
lst =[]
for tup in test_list:
for i in tar_list:
if i in tup:
lst.append(tup)
列表理解解决方案:
res = [tup for tup in test_list if any(i in tup for i in tar_list)]
谁能解释一下“any”在这里的作用是什么? 第一轮 - tup -> 1,4,6 如果 cond 为 tar_list[0] 返回 true,即 6,然后在 tar_list[1] 检查值 10,它返回 false。如果我不使用 ANY,则考虑 false 并且 tup 不应出现在最终列表 res 中。那是对的吗?我有点理解这里的任何用法,但想了解为什么在这种情况下第一个元组会在 res 列表中。
【问题讨论】:
-
“想了解为什么在这种情况下第一个元组会出现在 res 列表中” - 请与您所做的更改共享代码,这会给您带来您难以理解的结果。
-
我认为你没有做对。
any()将遍历一系列元素,如果至少一个元素具有真值,则返回 true,否则返回 false。如果你不在那里使用any(),你会留下if (i in tup for i in tar_list),它总是返回true,因为生成器不是“假的”。 -
如果 for 循环正确输出是:[(1, 4, 6), (1, 10)] 并且对于没有“任何”子句的列表理解返回 [(1, 4, 6 ), (5, 8), (2, 9), (1, 10)]。但是当我们使用“any”子句时,它会像 for 循环一样返回正确的输出。我已经为“for循环”以及列表理解共享了上面的代码。我希望这次我清楚了。谢谢。
-
@Reti43 不真/假取决于“我是否在 tup”?。
-
你一直说“没有
any”,但如果你删除any,剩下的表达式就是一个生成器,它的计算结果总是True。