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

Python无第三方库实现文件链读取与高频字符串生成求助

优化闭合文件链处理代码,支持任意长度链
  • 限制条件:禁止使用任何导入库
  • 核心任务:
    1. 处理闭合文件链:每个文件首行是下一个要打开的文件名,其余内容为若干单词,从任意文件出发遍历最终会回到起点
    2. 收集链中所有文件的单词,生成目标字符串:
      • 字符串第p位为所有单词第p位出现频率最高的字符(同频时选字母序靠前的)
      • 字符串长度等于所有单词中的最长长度
  • 当前问题:已实现3个文件的处理,但依赖局部变量传递,未实现通用链式遍历逻辑,希望优化后支持任意长度的文件链

作业任务详情

作业目标是设计实现一个函数,读取一系列文件中的字符串并生成新字符串:
字符串存于若干构成闭合链的文件中,每个文件的第一个字符串是链中另一个文件名,从任意文件出发遍历最终会回到起点(例:A.txt首行是B.txt,B.txt首行是C.txt,C.txt首行是A.txt,形成A→B→C→A的闭合链)。
除首行的下一个文件名外,每个文件还包含其他用空格、制表符或换行分隔的字符串。函数需读取链中所有字符串,构造一个新字符串:新字符串第p位是所有读取字符串第p位出现频率最高的字符;若多个字符频率相同,按字母序选择。新字符串长度等于读取到的最长字符串的长度。
函数接收一个文件名作为输入,返回构造好的字符串。
示例:test01目录下的A.txt、B.txt、C.txt内容如下:

test01/A.txttest01/B.txttest01/C.txt
test01/B.txttest01/C.txttest01/A.txt
househomekite
gardenparkhello
kitchenaffairportrait
balloonangel
surfing

调用most_frequent_chars("test01/A.txt")应返回"hareennt"

用户原代码

def file_names_list(filename):
    intermezzo = []
    lista_file = []

    a_file = open(filename)

    lines = a_file.readlines()
    for line in lines:
        intermezzo.extend(line.split())
    del intermezzo[1:]
    lista_file.append(intermezzo[0])
    intermezzo.pop(0)
    return lista_file


def words_list(filename):
    lista_file = []
    a_file = open(filename)

    lines = a_file.readlines()[1:]
    for line in lines:
        lista_file.extend(line.split())
    return lista_file

def stuff_list(filename):
    file_list = file_names_list(filename)
    the_rest = words_list(filename)
    second_file_name = file_names_list(file_list[0])
    
    the_lists = words_list(file_list[0]) and words_list(second_file_name[0])
    the_rest += the_lists[0:]
    return the_rest
    
def most_frequent_chars(filename):
    huge_words_list = stuff_list(filename)
    maxOccurs = ""
    list_of_chars = []
    for i in range(len(max(huge_words_list, key=len))):
        for item in huge_words_list:
            try:
                list_of_chars.append(item[i])
            except IndexError:
                pass
            
        maxOccurs += max(sorted(set(list_of_chars)), key = list_of_chars.count)
        list_of_chars.clear()
    return maxOccurs
print(most_frequent_chars("test01/A.txt"))

优化后的代码

def get_next_file_and_words(filename):
    """读取文件,返回下一个文件名和当前文件的单词列表"""
    with open(filename) as f:
        content = f.read().split()
    # 第一个元素是下一个文件名,剩下的是单词
    next_file = content[0]
    words = content[1:]
    return next_file, words

def collect_all_words(start_file):
    """遍历闭合文件链,收集所有单词"""
    all_words = []
    current_file = start_file
    visited = set()
    
    while current_file not in visited:
        visited.add(current_file)
        next_file, words = get_next_file_and_words(current_file)
        all_words.extend(words)
        current_file = next_file
    
    return all_words

def most_frequent_chars(filename):
    huge_words_list = collect_all_words(filename)
    if not huge_words_list:
        return ""
    
    max_len = max(len(word) for word in huge_words_list)
    result = []
    
    for p in range(max_len):
        chars = []
        for word in huge_words_list:
            if p < len(word):
                chars.append(word[p])
        
        # 先按字母序排序,再按频率取最大(同频时字母序靠前的会被选中)
        sorted_chars = sorted(chars)
        most_freq_char = max(sorted_chars, key=chars.count)
        result.append(most_freq_char)
    
    return ''.join(result)

# 测试调用
print(most_frequent_chars("test01/A.txt"))

优化点说明

  1. 链式遍历逻辑:collect_all_words函数通过记录已访问文件,循环遍历整个闭合链,直到回到起始文件,支持任意长度的文件链,不再局限于3个文件。
  2. IO优化:合并原来的两个辅助函数为get_next_file_and_words,一次读取文件内容并拆分,减少重复打开文件的操作,提升效率。
  3. 代码简洁性:用with语句自动管理文件资源,避免手动关闭文件的潜在问题;用更简洁的表达式简化逻辑。
  4. 核心逻辑保留:频率统计部分保留原逻辑,但提前计算最长单词长度,避免循环中重复调用max;排序后再取频率最高字符,确保同频时按字母序选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:35:50