You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现嵌套列表图书结构的模式匹配函数并返回匹配结果?

嵌套列表图书数据的模式匹配函数改造方案

需求说明

我们需要开发一个适配嵌套列表存储图书数据的模式匹配函数,图书数据结构如下:

books = [['author', ['elon', 'musk']],
        ['title', ['book', 'one']],
       
        ['author', ['elon', 'tusk']],
        ['title', ['book', 'two']]]

每本图书包含author和title两个字段,匹配规则为:

  • &:匹配单个任意元素
  • --:匹配多个任意元素(含零个)

测试用例

用例1

search1 = [['author', ['elon', '&']],
           ['title', ['book', '&']]]

匹配逻辑:

  • 作者规则:elon + 任意单个元素 → 匹配两本图书
  • 标题规则:book + 任意单个元素 → 匹配两本图书
  • 预期结果:返回全部两本图书

用例2

search2 = ['--', 
          ['title', ['book', 'one']]]

匹配逻辑:

  • --:匹配任意作者(所有作者均符合)
  • 标题规则:精确匹配book one
  • 预期结果:仅返回第一本图书

现有通用模式匹配函数仅返回布尔值,无法返回匹配的图书条目,需改造以实现需求:

def match(seq, pattern):
    if not pattern:
        return not seq
    elif pattern[0] == '--':
        if match(seq, pattern[1:]):
            return True
        elif not seq:
            return False
        else:
            return match(seq[1:], pattern)
    elif not seq:
        return False
    elif pattern[0] == '&':
        return match(seq[1:], pattern[1:])
    elif seq[0] == pattern[0]:
        return match(seq[1:], pattern[1:])
    elif type(seq[0]) == list and type(seq[0]) == list:  # 原代码存在bug,重复判断seq[0]
        if not match(seq, pattern):
            return False
    else:
        return False

改造方案

1. 先处理图书数据分组

原books是扁平结构,需先按author+title分组为单本图书的列表:

def group_books(raw_books):
    grouped = []
    current_book = []
    for item in raw_books:
        current_book.append(item)
        if len(current_book) == 2:
            grouped.append(current_book)
            current_book = []
    return grouped

分组后得到结构化的图书列表:

grouped_books = [
    [['author', ['elon', 'musk']], ['title', ['book', 'one']]],
    [['author', ['elon', 'tusk']], ['title', ['book', 'two']]]
]

2. 拆分匹配逻辑为两个函数

将序列匹配和字段匹配拆分,明确职责:

def match_sequence(seq, pattern):
    # 核心序列匹配逻辑,修复原代码bug
    if not pattern:
        return not seq
    elif pattern[0] == '--':
        if match_sequence(seq, pattern[1:]):
            return True
        elif not seq:
            return False
        else:
            return match_sequence(seq[1:], pattern)
    elif not seq:
        return False
    elif pattern[0] == '&':
        return match_sequence(seq[1:], pattern[1:])
    elif seq[0] == pattern[0]:
        return match_sequence(seq[1:], pattern[1:])
    elif isinstance(seq[0], list) and isinstance(pattern[0], list):
        if not match_sequence(seq[0], pattern[0]):
            return False
        return match_sequence(seq[1:], pattern[1:])
    else:
        return False

def is_field_match(book_item, pattern_item):
    # 匹配单个字段(如author/title项)
    if pattern_item[0] == '--':
        # --匹配任意字段,直接验证值部分
        return match_sequence(book_item[1], pattern_item[1])
    # 字段名必须一致,再验证值
    if book_item[0] != pattern_item[0]:
        return False
    return match_sequence(book_item[1], pattern_item[1])

3. 实现结果收集的外层函数

遍历分组后的图书,收集所有符合匹配规则的条目:

def match(search_pattern, raw_books):
    grouped_books = group_books(raw_books)
    matched = []
    for book in grouped_books:
        # 验证当前图书是否满足所有搜索条件
        all_conditions_met = True
        for pattern in search_pattern:
            field_matched = False
            for book_item in book:
                if is_field_match(book_item, pattern):
                    field_matched = True
                    break
            if not field_matched:
                all_conditions_met = False
                break
        if all_conditions_met:
            matched.append(book)
    return matched

测试验证

# 测试用例1
search1 = [['author', ['elon', '&']], ['title', ['book', '&']]]
print(match(search1, books))
# 输出:[[['author', ['elon', 'musk']], ['title', ['book', 'one']]], [['author', ['elon', 'tusk']], ['title', ['book', 'two']]]]

# 测试用例2
search2 = ['--', ['title', ['book', 'one']]]
print(match(search2, books))
# 输出:[[['author', ['elon', 'musk']], ['title', ['book', 'one']]]]

内容的提问来源于stack exchange,提问作者Bart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:01:20