Python无第三方库实现文件链读取与高频字符串生成求助
优化闭合文件链处理代码,支持任意长度链
- 限制条件:禁止使用任何导入库
- 核心任务:
- 处理闭合文件链:每个文件首行是下一个要打开的文件名,其余内容为若干单词,从任意文件出发遍历最终会回到起点
- 收集链中所有文件的单词,生成目标字符串:
- 字符串第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.txt test01/B.txt test01/C.txt test01/B.txt test01/C.txt test01/A.txt house home kite garden park hello kitchen affair portrait balloon angel 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"))
优化点说明
- 链式遍历逻辑:
collect_all_words函数通过记录已访问文件,循环遍历整个闭合链,直到回到起始文件,支持任意长度的文件链,不再局限于3个文件。 - IO优化:合并原来的两个辅助函数为
get_next_file_and_words,一次读取文件内容并拆分,减少重复打开文件的操作,提升效率。 - 代码简洁性:用
with语句自动管理文件资源,避免手动关闭文件的潜在问题;用更简洁的表达式简化逻辑。 - 核心逻辑保留:频率统计部分保留原逻辑,但提前计算最长单词长度,避免循环中重复调用
max;排序后再取频率最高字符,确保同频时按字母序选择。
内容的提问来源于stack exchange,提问作者youngsoyuz
相关产品推荐
相关产品推荐

