微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python 列表理解 - 使用 any

如何解决python 列表理解 - 使用 any

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

从测试列表中保留包含任何目标列表元素的元组

Filtered tuple from list are : [(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,6 如果 cond 为 tar_list[0] 返回 true,即 6,然后检查 tar_list[1] 处的值 10,则返回 false。如果我不使用 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 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,6)]
[(1,6)]

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

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

any() 将通过布尔迭代器并在元素之间执行 or 操作(不完全,但足够接近)。因此,如果找到 1 个或多个 True 值,则返回 True,否则返回 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() 返回一个布尔值。现在查看您的代码

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

您正在执行列表推导式,并且使用 if 条件。对于您通过 test_list 的每个元组,您检查 tar_list 中的任何元素是否存在于元组中。如果是这样,您会得到一个 True 并添加它,否则您会得到一个 False 并且不添加它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?