如何检测test_list是否以template_list中的任一子列表开头?
问题:判断test_list开头是否匹配template_list中的子列表
给定如下template_list:
template_list = [['item 1'], ['item 2','item 3']]
需要实现逻辑:判断test_list的开头是否与template_list中的某个子列表完全一致——即使test_list包含更多后续无关元素,也需返回True。
原有代码的问题
原代码尝试通过截取模板子列表的前len(test_list)项与test_list比较:
print(any([x[:len(test_list)] == test_list for x in template_list]))
这种方式仅当test_list长度≤模板子列表长度时有效,当test_list更长时,模板子列表截取后长度不足,无法匹配,导致返回False,不符合需求。
正确实现方式
我们需要反过来:截取test_list的前len(x)项(x为模板中的子列表),与x直接比较。如果test_list的开头完全等于某个模板子列表,就返回True。
代码实现:
template_list = [['item 1'], ['item 2','item 3']] # 测试案例1:test_list与模板子列表长度一致 test_list = ['item 1'] print(any(test_list[:len(x)] == x for x in template_list)) # 返回True # 测试案例2:test_list与模板子列表长度一致 test_list = ['item 2', 'item 3'] print(any(test_list[:len(x)] == x for x in template_list)) # 返回True # 测试案例3:test_list更长,开头匹配模板子列表 test_list = ['item 1', 'irrelevant item 1', 'irrelevant item 2', 'irrelevant item 3'] print(any(test_list[:len(x)] == x for x in template_list)) # 返回True # 测试案例4:test_list更长,开头匹配模板子列表 test_list = ['item 2', 'item 3', 'irrelevant item 1', 'irrelevant item 2'] print(any(test_list[:len(x)] == x for x in template_list)) # 返回True
逻辑说明
- 遍历
template_list中的每个子列表x - 截取
test_list的前len(x)个元素,和x做全等比较 - 只要有任意一个
x满足匹配条件,any()就会返回True
内容的提问来源于stack exchange,提问作者Jenny Distel
相关产品推荐
相关产品推荐

