You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python按自定义单词-数字映射规则排序TXT文件行的实现问题

如何按特定单词优先级排序文本行并保留原始内容?

问题描述

我想实现这样的功能:加载一个.txt文件,逐行处理并将特定单词转换为对应数字,根据转换后的数字对行进行排序,最后显示原始行。我写了代码但没得到预期效果,具体情况如下:

我的.txt文件内容:

ABC ABC ABC Data1 ABC
ABC ABC ABC Data3 ABC
ABC ABC ABC Data2 ABC
ABC ABC ABC Data2 ABC
ABC ABC ABC Data3 ABC

期望输出(按Data3→Data1→Data2→Data4的优先级排序):

ABC ABC ABC Data3 ABC
ABC ABC ABC Data3 ABC
ABC ABC ABC Data1 ABC
ABC ABC ABC Data2 ABC
ABC ABC ABC Data2 ABC

原代码:

def convert(word):
    if word == "data3":
        return "1"
    elif word == "data1":
        return "2"
    elif word == "data4":
        return "3"
    elif word == "data3":
        return "4"

with open("file.txt", "r") as f:
    for num, line in enumerate(f.readlines(), 1):
        for word in line.split():
            convert(word)
        sorted(word)
        print(line)

原代码的问题分析

我帮你梳理下几个关键问题:

  • 大小写不匹配:你的文本里是Data1/Data3,但代码里判断的是小写data1/data3,导致转换函数根本匹配不到目标单词。
  • 转换函数逻辑错误:函数里两次判断word == "data3",后面的return "4"永远不会被触发,而且完全没处理Data2的情况。
  • 排序逻辑完全错误:你是逐行处理时尝试排序,但sorted(word)只是对单个单词的字符排序,既没有把转换后的优先级和原始行关联,也没有对所有行做整体排序。

修正后的代码

这里是调整后的完整代码,能实现你想要的排序效果:

# 定义优先级映射:键是文本里的目标单词,值是排序用的优先级数字(数字越小越靠前)
priority_map = {
    "Data3": 1,
    "Data1": 2,
    "Data2": 3,
    "Data4": 4
}

def get_sort_key(line):
    # 遍历行内的每个单词,找到匹配优先级映射的单词,返回对应的优先级
    for word in line.split():
        if word in priority_map:
            return priority_map[word]
    # 如果行里没有目标单词,默认排最后
    return 5

# 读取所有行并排序
with open("file.txt", "r") as f:
    # 读取所有行,同时去除每行末尾的换行符(避免输出多空行)
    lines = [line.rstrip('\n') for line in f]
    # 根据自定义的排序key对行进行排序
    sorted_lines = sorted(lines, key=get_sort_key)

# 输出排序后的原始行
for line in sorted_lines:
    print(line)

代码解释

  1. 优先级映射字典:用priority_map直接定义单词和排序优先级的对应关系,比多个if-elif更清晰易维护,也完美解决了大小写匹配问题。
  2. 获取排序key的函数get_sort_key函数会遍历每行的单词,找到匹配的目标单词后返回对应的优先级数字,这样sorted函数就能根据这个数字对行排序。
  3. 整体排序逻辑:先一次性读取所有行,再用sorted函数结合自定义key进行整体排序,这才是实现行排序的正确方式。
  4. 边界情况处理:如果某行没有任何目标单词,默认返回优先级5,会排在所有有目标单词的行后面。

运行这段代码后,就能得到你期望的输出结果啦!

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

火山引擎 最新活动