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

Python list.index错误:歌词分割时索引未正确重置问题

问题:分割以英文句号分隔的歌词段落时索引异常

我正在编写Python代码,读取以英文句号(.)分隔不同段落的歌词.txt文件,尝试用for循环实现段落分割,但遇到问题:索引总是回到第一个分隔行。

我的函数代码:

import os

with open(os.path.join(file_path, file_name), 'rt', encoding='utf-8') as file:
    songlyrics = file.read()
songlyrics = str(songlyrics)
split_lyrics = songlyrics.splitlines()
print(split_lyrics)
print("SEPARATE START \n")
count = -1
lyrics_in_page = []
for line in split_lyrics:
    count += 1
    print("Count: ", count, "Line: ", split_lyrics.index(line))
    if '.' in line:
        print("SEPARATE \n")

        line_index = split_lyrics.index(line)
        print("Line index: ", line_index)

        start = line_index - count
        end = line_index

        songpart = split_lyrics[start:end]
        print("songpart at: ", start, end)
        print(songpart)
        count = -1

运行输出:

['Noche de paz, noche de amor', 'Todo duerme alrededor', 'Entre los astros que esparcen su luz', 'Bella, anunciando al niño Jesús', 'Brilla la estrella de paz', 'Brilla la estrella de amor', '.', 'Noche de paz, noche de luz', 'Ha nacido Jesús', 'Pastorcillos que oíd anunciar', 'No temáis cuando entréis a adorar', 'Que ha nacido el amor', 'Que ha nacido el amor', '.', 'Desde el pesebre del niño Jesús', 'La Tierra entera se llena de luz', 'Porque ha nacido Jesús', 'Entre canciones de amor', '.']
SEPARATE START 

Count:  0 Line:  0
Count:  1 Line:  1
Count:  2 Line:  2
Count:  3 Line:  3
Count:  4 Line:  4
Count:  5 Line:  5
Count:  6 Line:  6
SEPARATE 

Line index:  6
songpart at:  0 6
['Noche de paz, noche de amor', 'Todo duerme alrededor', 'Entre los astros que esparcen su luz', 'Bella, anunciando al niño Jesús', 'Brilla la estrella de paz', 'Brilla la estrella de amor']
Count:  0 Line:  7
Count:  1 Line:  8
Count:  2 Line:  9
Count:  3 Line:  10
Count:  4 Line:  11
Count:  5 Line:  11
Count:  6 Line:  6
SEPARATE 

Line index:  6
songpart at:  0 6
['Noche de paz, noche de amor', 'Todo duerme alrededor', 'Entre los astros que esparcen su luz', 'Bella, anunciando al niño Jesús', 'Brilla la estrella de paz', 'Brilla la estrella de amor']
Count:  0 Line:  14
Count:  1 Line:  15
Count:  2 Line:  16
Count:  3 Line:  17
Count:  4 Line:  6
SEPARATE 

Line index:  6
songpart at:  2 6
['Entre los astros que esparcen su luz', 'Bella, anunciando al niño Jesús', 'Brilla la estrella de paz', 'Brilla la estrella de amor']

Process finished with exit code 0

我已尝试调整索引和计数变量,但if语句似乎未正确重置相关变量(line_index始终未变化),添加打印语句排查仍未解决,恳请帮助。


问题分析与解决方案

核心问题

你代码中的split_lyrics.index(line)是关键错误:这个方法会返回列表中第一个匹配该元素的索引。当歌词里出现重复内容(比如"Que ha nacido el amor"出现两次,或者多个单独的"."行),它只会返回第一次出现的位置,导致后续分割时拿到的索引始终是第一个分隔行的位置。

另外用count计算当前段落行数的逻辑冗余且容易出错,不如直接跟踪段落的起始索引。

修复后的代码

直接用enumerate遍历列表,同时获取当前行的索引和内容,确保拿到准确位置;用变量跟踪段落起始位置,遇到分隔符时切割段落并重置起始位置:

import os

with open(os.path.join(file_path, file_name), 'rt', encoding='utf-8') as file:
    split_lyrics = file.read().splitlines()

print(split_lyrics)
print("\nSEPARATE START \n")

lyrics_in_page = []
start_idx = 0  # 跟踪当前段落的起始索引

for idx, line in enumerate(split_lyrics):
    # 遇到分隔符且不是段落开头的空分隔(避免处理文件开头的.)
    if '.' in line and idx > start_idx:
        # 切割从start_idx到当前索引的内容(不包含当前的.行)
        songpart = split_lyrics[start_idx:idx]
        print(f"songpart at: {start_idx} {idx}")
        print(songpart)
        # 重置起始索引为当前行的下一行
        start_idx = idx + 1
        print("\nSEPARATE \n")

# 处理最后一段(如果文件末尾没有.结尾的情况)
if start_idx < len(split_lyrics):
    songpart = split_lyrics[start_idx:]
    print(f"Last songpart at: {start_idx} {len(split_lyrics)}")
    print(songpart)

代码说明

  1. enumerate遍历:直接获取每个元素的真实索引,彻底避免index()方法的重复元素问题。
  2. 起始索引跟踪:用start_idx记录当前段落的起始位置,遇到分隔符时直接用start_idx到当前索引切割段落,逻辑清晰不易出错。
  3. 末尾段落处理:如果文件最后没有以.结尾,也能正确提取最后一段内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:50:16