0

0

Python 字母矩阵中高亮显示单词的完整实现教程

霞舞

霞舞

发布时间:2026-03-03 21:57:01

|

233人浏览过

|

来源于php中文网

原创

Python 字母矩阵中高亮显示单词的完整实现教程

本文详解如何在 python 生成的字母矩阵中精准高亮已找到的单词(如 word search),通过分离「坐标定位」与「样式渲染」逻辑,避免常见着色错误,确保每个匹配字符在原位置正确着色。

本文详解如何在 python 生成的字母矩阵中精准高亮已找到的单词(如 word search),通过分离「坐标定位」与「样式渲染」逻辑,避免常见着色错误,确保每个匹配字符在原位置正确着色。

在实现单词搜索(Word Search)类程序时,一个常见但易出错的需求是:在原始生成的矩阵中,仅将实际匹配到的单词字符高亮显示(如红色),其余字符保持原样。原始代码的问题在于:search_words() 函数试图在字符串拼接层面做条件着色(例如 if letter in word),这会导致语义错误——因为单个字母(如 'a')可能属于多个单词,或与目标单词无关却因重合被误标;更严重的是,它未记录单词在矩阵中的真实行列坐标,导致无法在原矩阵上下文中精准着色。

正确的解法是遵循 “定位 → 标记 → 渲染” 三步分离原则

  1. 定位(Find):遍历矩阵各方向(水平、垂直、对角线等),对每个待搜索单词,返回其所有匹配起始坐标及方向长度;
  2. 标记(Mark):将所有匹配位置转换为 (row, col) 坐标列表,不修改原始数据;
  3. 渲染(Render):基于原始矩阵和坐标列表,生成带 ANSI 颜色的新矩阵,仅对指定位置应用 Fore.RED + char + Style.RESET_ALL。

以下为可直接运行的重构实现(兼容 VS Code 终端,需安装 colorama):

DoMore.ai
DoMore.ai

DoMore.ai 是一个个性化的 AI 工具目录

下载
pip install colorama
from colorama import init, Fore, Style
import random
import math
import json

init(autoreset=True)  # 自动重置样式,避免颜色污染后续输出

def generate_matrix(text):
    # 提取纯字母并转小写
    letters = [c.lower() for c in text if c.isalpha()]
    n = len(letters)
    if n == 0:
        raise ValueError("输入文本不含有效字母")

    size = math.ceil(math.sqrt(n))
    total_cells = size * size
    # 补齐空格使矩阵为正方形
    padded = letters + [' '] * (total_cells - n)
    random.shuffle(padded)
    return [padded[i:i+size] for i in range(0, total_cells, size)]

# ✅ 步骤1:精准定位单词坐标(支持水平、垂直、主/反对角线)
def find_word_coordinates(matrix, words):
    coords = set()  # 使用 set 避免重复高亮同一位置
    rows, cols = len(matrix), len(matrix[0])

    # 水平搜索(左→右)
    for i in range(rows):
        row_str = ''.join(matrix[i])
        for word in words:
            start = 0
            while True:
                pos = row_str.find(word, start)
                if pos == -1:
                    break
                for k in range(len(word)):
                    coords.add((i, pos + k))
                start = pos + 1

    # 垂直搜索(上→下)
    for j in range(cols):
        col_str = ''.join(matrix[i][j] for i in range(rows))
        for word in words:
            start = 0
            while True:
                pos = col_str.find(word, start)
                if pos == -1:
                    break
                for k in range(len(word)):
                    coords.add((pos + k, j))
                start = pos + 1

    # 主对角线(↘,从左上到右下)
    for i in range(rows):
        for j in range(cols):
            # 从 (i,j) 开始向右下延伸的最大长度
            max_len = min(rows - i, cols - j)
            diag_str = ''.join(matrix[i+k][j+k] for k in range(max_len))
            for word in words:
                start = 0
                while True:
                    pos = diag_str.find(word, start)
                    if pos == -1:
                        break
                    for k in range(len(word)):
                        coords.add((i + pos + k, j + pos + k))
                    start = pos + 1

    # 反对角线(↙,从右上到左下)
    for i in range(rows):
        for j in range(cols-1, -1, -1):
            max_len = min(rows - i, j + 1)
            diag_str = ''.join(matrix[i+k][j-k] for k in range(max_len))
            for word in words:
                start = 0
                while True:
                    pos = diag_str.find(word, start)
                    if pos == -1:
                        break
                    for k in range(len(word)):
                        coords.add((i + pos + k, j - pos - k))
                    start = pos + 1

    return list(coords)

# ✅ 步骤2:基于坐标渲染高亮矩阵
def highlight_matrix(matrix, coordinates):
    highlighted = []
    for i, row in enumerate(matrix):
        new_row = []
        for j, char in enumerate(row):
            if (i, j) in coordinates:
                new_row.append(Fore.RED + char + Style.RESET_ALL)
            else:
                new_row.append(char)
        highlighted.append(new_row)
    return highlighted

# ✅ 步骤3:统一搜索入口(返回高亮后矩阵)
def search_and_highlight(matrix, words):
    coords = find_word_coordinates(matrix, words)
    return highlight_matrix(matrix, coords)

# —— 主程序逻辑 ——
if __name__ == "__main__":
    # 示例词典(实际使用时替换为你的 JSON 文件)
    # with open('words_dictionary.json') as f:
    #     words_to_search = [w for w in json.load(f) if len(w) >= 4]
    words_to_search = ["cat", "dog", "rat", "art"]  # 简化测试用

    text_input = input("Enter a text: ")

    try:
        matrix = generate_matrix(text_input)
        print("\nOriginal matrix:")
        for row in matrix:
            print(' '.join(row))

        highlighted = search_and_highlight(matrix, words_to_search)
        print("\nMatrix with found words highlighted (red):")
        for row in highlighted:
            print(' '.join(row))

    except ValueError as e:
        print(f"Error: {e}")

关键注意事项与优化建议:

  • ✅ 坐标唯一性:使用 set() 存储坐标,自动去重。若同一位置被多个单词匹配(如 "art" 和 "rat" 共享 'r'),只高亮一次,避免样式嵌套冲突。
  • ✅ autoreset=True:colorama.init(autoreset=True) 是关键——它确保每个着色字符后自动重置样式,防止后续打印被意外染色(原始代码缺失此设置,常导致终端整行变红)。
  • ⚠️ 性能提示:对超大词典(如 37 万词),全量扫描会显著变慢。生产环境建议:
    • 限制搜索词长度(如 len(word) between 4 and 12);
    • 使用 Aho-Corasick 算法批量匹配(pyahocorasick 库);
    • 或预筛:仅搜索长度 ≤ 矩阵边长的单词。
  • ? 调试技巧:临时打印 find_word_coordinates(...) 返回的坐标列表,验证定位准确性(例如 print("Found at:", coords))。
  • ? 扩展样式:除 Fore.RED,还可组合 Style.BRIGHT 加粗,或用 Back.YELLOW 背景高亮:
    Fore.RED + Style.BRIGHT + char + Style.RESET_ALL

通过将「逻辑定位」与「视觉渲染」彻底解耦,代码不仅更健壮、易调试,也便于后续扩展(如添加反向搜索、模糊匹配或 GUI 可视化)。记住:永远先确定“哪里要改”,再决定“怎么改”——这是处理任何终端渲染问题的黄金法则。

立即学习Python免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1108

2024.03.22

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号