python中有两个非常好用的函数,all和any,它们最常用的方法是检查可迭代对象中的元素是否为真的情况;
其中,any为检查可迭代对象中是否至少有一个元素为True;
all为检查可迭代对象中是否所有元素都为True。
基本概念
any() 函数
- 功能:检查可迭代对象中是否至少有一个元素为True
- 返回值:如果存在至少一个True元素,返回True;否则返回False
- 空迭代对象:对于空的可迭代对象,any() 返回False
all() 函数
- 功能:检查可迭代对象中是否所有元素都为True
- 返回值:如果所有元素都是True,返回True;否则返回False
- 空迭代对象:对于空的可迭代对象,all() 返回True
基本用法
# any() 示例
print(any([False, False, True, False])) # True
print(any([0, 0, 0, 0])) # False
print(any([])) # False
# all() 示例
print(all([True, True, True, True])) # True
print(all([1, 2, 3, 0])) # False
print(all([])) # True
常用用法
我经常使用all和any判断两个列表的包含情况,例如:
# 原始数据
partial_arrival_list = ['INFO_RECEIVED', 'INFO_RECEIVED', 'IN_TRANSIT', 'WAITING_DELIVERY', 'DELIVERED']
# 以下是测试用例:
print("=== 测试用例 ===")
# 测试1: 完全匹配的子集(应该打印"测试")
package_status_set = ['INFO_RECEIVED', 'IN_TRANSIT']
if all(element in partial_arrival_list for element in package_status_set):
print("测试1: 应该打印 - 所有元素都在列表中")
# 测试2: 完全相同集合(应该打印"测试")
package_status_set = ['INFO_RECEIVED', 'INFO_RECEIVED', 'IN_TRANSIT', 'WAITING_DELIVERY', 'DELIVERED']
if all(element in partial_arrival_list for element in package_status_set):
print("测试2: 应该打印 - 完全相同的列表")
# 测试3: 单个元素(应该打印"测试")
package_status_set = ['DELIVERED']
if all(element in partial_arrival_list for element in package_status_set):
print("测试3: 应该打印 - 单个有效元素")
# 测试4: 空集合(应该打印"测试")- all() 对空可迭代对象返回 True
package_status_set = []
if all(element in partial_arrival_list for element in package_status_set):
print("测试4: 应该打印 - 空集合")
# 测试5: 包含不存在元素的集合(不应该打印)
package_status_set = ['INFO_RECEIVED', 'UNKNOWN_STATUS']
if all(element in partial_arrival_list for element in package_status_set):
print("测试5: 不应该打印 - 包含无效元素")
# 测试6: 完全不相关的集合(不应该打印)
package_status_set = ['CANCELLED', 'RETURNED']
if all(element in partial_arrival_list for element in package_status_set):
print("测试6: 不应该打印 - 所有元素都不在列表中")
# 测试7: 部分有效部分无效(不应该打印)
package_status_set = ['INFO_RECEIVED', 'IN_TRANSIT', 'INVALID']
if all(element in partial_arrival_list for element in package_status_set):
print("测试7: 不应该打印 - 混合有效和无效元素")
# 测试8: 重复的有效元素(应该打印"测试")
package_status_set = ['INFO_RECEIVED', 'INFO_RECEIVED', 'INFO_RECEIVED']
if all(element in partial_arrival_list for element in package_status_set):
print("测试8: 应该打印 - 重复的有效元素")
# 测试9: 所有状态各一个(应该打印"测试")
package_status_set = ['INFO_RECEIVED', 'IN_TRANSIT', 'WAITING_DELIVERY', 'DELIVERED']
if all(element in partial_arrival_list for element in package_status_set):
print("测试9: 应该打印 - 所有不重复的状态")
# 测试10: 大小写问题(不应该打印,如果原始列表是大写)
package_status_set = ['info_received', 'IN_TRANSIT'] # 第一个元素小写
if all(element in partial_arrival_list for element in package_status_set):
print("测试10: 不应该打印 - 大小写不匹配")
# 测试11: 使用集合而不是列表
package_status_set = {'INFO_RECEIVED', 'IN_TRANSIT'}
if all(element in partial_arrival_list for element in package_status_set):
print("测试11: 应该打印 - 使用集合也可以")
print("\n=== 完整测试函数 ===")
def test_package_status(package_status_set, test_name):
"""
测试给定的package_status_set是否完全包含在partial_arrival_list中
"""
result = all(element in partial_arrival_list for element in package_status_set)
print(f"{test_name}: {package_status_set} -> {'通过' if result else '不通过'}")
return result
# 批量测试
test_cases = [
(['INFO_RECEIVED', 'IN_TRANSIT'], "正常子集"),
(['DELIVERED'], "单个元素"),
([], "空集合"),
(['UNKNOWN'], "无效元素"),
(['INFO_RECEIVED', 'UNKNOWN'], "混合无效"),
(['INFO_RECEIVED'] * 3, "重复有效元素"),
(['INFO_RECEIVED', 'IN_TRANSIT', 'WAITING_DELIVERY', 'DELIVERED'], "所有状态"),
]
for status_set, name in test_cases:
test_package_status(status_set, name)
上述代码检测列表包裹状态package_status_set是不是所有元素都在部分到达列表partial_arrival_list中,如何包裹状态均在,则返回True;
同样的,我们也可以用any函数判断异常情况
# 异常物流状态列表
exceptional_logistics_list = ['DELIVERY_FAILED', 'ABNORMAL', 'EXPIRED']
print("=== 测试用例 ===")
# 测试1: 包含一个异常状态(应该触发条件)
package_status_set = ['INFO_RECEIVED', 'DELIVERY_FAILED', 'IN_TRANSIT']
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试1: 应该触发 - 包含DELIVERY_FAILED")
# 测试2: 包含多个异常状态(应该触发条件)
package_status_set = ['ABNORMAL', 'EXPIRED', 'DELIVERED']
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试2: 应该触发 - 包含多个异常状态")
# 测试3: 所有都是异常状态(应该触发条件)
package_status_set = ['DELIVERY_FAILED', 'ABNORMAL', 'EXPIRED']
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试3: 应该触发 - 所有都是异常状态")
# 测试4: 单个异常状态(应该触发条件)
package_status_set = ['ABNORMAL']
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试4: 应该触发 - 单个异常状态")
# 测试5: 不包含异常状态(不应该触发)
package_status_set = ['INFO_RECEIVED', 'IN_TRANSIT', 'DELIVERED']
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试5: 不应该触发 - 没有异常状态")
# 测试6: 空集合(不应该触发)
package_status_set = []
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试6: 不应该触发 - 空集合")
# 测试7: 混合正常和异常状态(应该触发)
package_status_set = ['INFO_RECEIVED', 'EXPIRED', 'WAITING_DELIVERY']
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试7: 应该触发 - 混合状态,包含EXPIRED")
# 测试8: 重复的异常状态(应该触发)
package_status_set = ['DELIVERY_FAILED', 'DELIVERY_FAILED', 'IN_TRANSIT']
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试8: 应该触发 - 重复的异常状态")
# 测试9: 大小写不匹配(不应该触发)
package_status_set = ['delivery_failed', 'IN_TRANSIT'] # 小写
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试9: 不应该触发 - 大小写不匹配")
# 测试10: 部分匹配的字符串(不应该触发)
package_status_set = ['DELIVERY_FAIL', 'FAILED_DELIVERY'] # 相似但不同
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试10: 不应该触发 - 相似但不匹配的字符串")
# 测试11: 使用集合而不是列表
package_status_set = {'DELIVERY_FAILED', 'INFO_RECEIVED'}
if any(i in exceptional_logistics_list for i in package_status_set):
print("测试11: 应该触发 - 使用集合")
print("\n=== 完整测试函数 ===")
def check_exceptional_logistics(package_status_set, test_name):
"""
检查给定的package_status_set是否包含任何异常物流状态
"""
result = any(i in exceptional_logistics_list for i in package_status_set)
status = "异常" if result else "正常"
print(f"{test_name}: {package_status_set} -> {status}")
return result
# 批量测试
test_cases = [
(['INFO_RECEIVED', 'DELIVERY_FAILED'], "包含一个异常"),
(['ABNORMAL'], "只有异常状态"),
(['INFO_RECEIVED', 'IN_TRANSIT', 'DELIVERED'], "全部正常"),
([], "空集合"),
(['EXPIRED', 'RETURNED'], "异常和未知状态"),
(['DELIVERY_FAILED', 'DELIVERY_FAILED'], "重复异常"),
(['PENDING', 'PROCESSING'], "其他正常状态"),
(['INFO_RECEIVED', 'ABNORMAL', 'WAITING_DELIVERY'], "混合状态"),
]
for status_set, name in test_cases:
check_exceptional_logistics(status_set, name)
print("\n=== 实际应用场景示例 ===")
# 示例1: 物流追踪系统
def process_package_status(package_id, status_list):
"""处理包裹状态,检查是否有异常"""
if any(i in exceptional_logistics_list for i in status_list):
print(f"包裹 {package_id}: 存在异常状态,需要人工处理")
return "需要干预"
else:
print(f"包裹 {package_id}: 状态正常,继续自动处理")
return "正常流程"
# 测试不同包裹
packages = [
("PKG001", ['INFO_RECEIVED', 'IN_TRANSIT']),
("PKG002", ['INFO_RECEIVED', 'DELIVERY_FAILED']),
("PKG003", ['EXPIRED']),
("PKG004", ['DELIVERED']),
]
for package_id, status_list in packages:
process_package_status(package_id, status_list)
当包裹状态列表中有任何的异常状态,立刻返回True,这样不用写复杂的循环或者条件判断,且逻辑更清晰,更方便的执行后续流程。