如何解决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 举报,一经查实,本站将立刻删除。