python 列表理解 - 使用任何

python list comprehension - use of any

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)]

谁能解释一下“任何”在这里的作用是什么? 第一轮 - tup -> 1,4,6 如果 tar_list[0] 的 cond returns 为真,即 6,然后它检查 tar_list[1] 处的值 10,它 returns 为假。如果我不使用 ANY 那么 false 被认为是并且 tup 不应该在最终列表 res 中。那是对的吗?我有点理解这里的 any 用法,但想了解为什么在那种情况下第一个元组会在 res 列表中。

any 只是检查列表中的任何值是否为真。如果您只想过滤到单个 tar_value,这很简单:只需使用列表理解过滤 [tup for tup in test_list if tar_value in tup].

但是,您想检查 tar_list 中的 任何 个值是否存在于 test_list 中。所以 i in tup for i in tar_list 部分只是对 tar_list 中的每个元素运行上述测试。由于您想保留其中包含 6 10 的元素,因此您可以使用 any 检查是否有任何元素返回 true。如果你想检查 6 and 10 是否在元素中,你可以使用 all.

如果您考虑嵌套的 for 循环:

for i in tar_list:
    if i in tup:
        lst.append(tup)

这将遍历 tar_list 中的值,如果 任何 在当前 tup 值中,则 tup值将添加到 lst

作为列表理解,您将该条件写为

if any(i in tup for i in tar_list)

现在,如果每个 tup 值仅包含 tar_list 中的一个值,则这些结果 相同。考虑这种情况:

test_list = [(1, 4, 6), (5, 8), (2, 9), (1, 10)] 
tar_list = [4, 6]

在这种情况下,您的原始循环会将第一个元组附加到输出两次,而列表理解只会将其附加一次。

lst =[]
for tup in test_list:
    for i in tar_list:
        if i in tup:
            lst.append(tup)
print(lst)

lst = [tup for tup in test_list if any(i in tup for i in tar_list)]
print(lst)

输出

[(1, 4, 6), (1, 4, 6)]
[(1, 4, 6)]

您可以通过在附加到 lst 后添加 break 来防止原始循环重复:

lst =[]
for tup in test_list:
    for i in tar_list:
        if i in tup:
            lst.append(tup)
            break

如果您真的想将元组附加到输出列表两次,您需要将理解修改为 完全 与原始循环相同:

lst = [tup for tup in test_list for i in tar_list if i in tup]

输出(以上数据):

[(1, 4, 6), (1, 4, 6)]

any() 将通过布尔迭代器并在元素之间执行 or 操作(不完全是,但足够接近)。因此,如果它找到 1 个或多个 True 值,则它 returns True,否则将 return False

tup = (1, 10)
tar_list = [6, 10] 

print([i in tup for i in tar_list])
# Output: [False, True]
print(any([i in tup for i in tar_list]))
# Output: True

所以 any() return 是一个布尔值。现在查看您的代码

res = [tup for tup in test_list if any(i in tup for i in tar_list)]

你正在做一个列表理解,并且有一个 if 条件。对于您遍历 test_list 的每个元组,您检查 tar_list 中的任何元素是否存在于元组中。如果是这样,您会得到一个 True 并添加它,否则您会得到一个 False 并且您不添加它。