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
并且您不添加它。
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
并且您不添加它。