利用python基礎實現停頓輸出歌詞

2021-08-22 05:55:14 字數 3745 閱讀 3994

給出一段字串,其中包括時間和歌詞,按照時間的順序進行輸出歌詞。

歌詞樣式如下:

musiclrc = """[00:03.50]傳奇

[00:19.10]作詞:劉兵 作曲:李健

[00:20.60]演唱:王菲

[00:26.60]

[04:40.75][02:39.90][00:36.25]只是因為在人群中多看了你一眼

[04:49.00]

[02:47.44][00:43.69]再也沒能忘掉你容顏

[02:54.83][00:51.24]夢想著偶然能有一天再相見

[03:02.32][00:58.75]從此我開始孤單思念

[03:08.15][01:04.30]

[03:09.35][01:05.50]想你時你在天邊

[03:16.90][01:13.13]想你時你在眼前

[03:24.42][01:20.92]想你時你在腦海

[03:31.85][01:28.44]想你時你在心田

[03:38.67][01:35.05]

[04:09.96][03:39.87][01:36.25]寧願相信我們前世有約

[04:16.37][03:46.38][01:42.47]今生的愛情故事 不會再改變

[04:24.82][03:54.83][01:51.18]寧願用這一生等你發現

[04:31.38][04:01.40][01:57.43]我一直在你身旁 從未走遠

[04:39.55][04:09.00][02:07.85]

"""

首先第一步我們得到一行一行的資料:通過字串的函式 splitlines() 我們就可以得到一行一行的資料列表。

對歌詞與時間的分隔:首先我們想到split()可以對資料分隔開,這樣就可以處理了,但是我們得到的資料是不方便處理的而且還不好選擇分隔符號,所以我們要對時間旁邊的 " [ ] " 進行處理。我們可以用replace()將多餘的符號替換成空字元,然後再對其分隔,所以我們先將 " [ " 替換成空字元,然後對 " ] " 進行分隔這個時候我們就能得到的就是分隔開之後的資料。

當我們得到資料的時候我們要將資料先臨時儲存下來然後再對資料操作,我們存下的資料是 「 時間 」  「 歌詞 」,所以我們可以用字典的形式對其儲存。

當我們儲存的時候我們就要求出時間的間隔段,所以我們就要用乙個列表來儲存時間,來排序,然後再進行資料處理得到停頓時間,然後就可以進行遍歷的操作。

在存到字典的過程中我們一行中有多個時間段的處理: 我們可以先得出乙個時間出現的次數 然後再存入字典中對其迴圈的輸入。

停頓時間的處理,一開始第三秒才出現歌詞,所以在時間的處理中我們需要注意第一次,而且注意:字典是無須的 輸出的時候是有順序的,我們在進行操作之前要對其進行排序。

其他的一些處理小細節也要多注意,在處理中我們資料型別的變化。

import time

musiclrc = """[00:03.50]傳奇

[00:19.10]作詞:劉兵 作曲:李健

[00:20.60]演唱:王菲

[00:26.60]

[04:40.75][02:39.90][00:36.25]只是因為在人群中多看了你一眼

[04:49.00]

[02:47.44][00:43.69]再也沒能忘掉你容顏

[02:54.83][00:51.24]夢想著偶然能有一天再相見

[03:02.32][00:58.75]從此我開始孤單思念

[03:08.15][01:04.30]

[03:09.35][01:05.50]想你時你在天邊

[03:16.90][01:13.13]想你時你在眼前

[03:24.42][01:20.92]想你時你在腦海

[03:31.85][01:28.44]想你時你在心田

[03:38.67][01:35.05]

[04:09.96][03:39.87][01:36.25]寧願相信我們前世有約

[04:16.37][03:46.38][01:42.47]今生的愛情故事 不會再改變

[04:24.82][03:54.83][01:51.18]寧願用這一生等你發現

[04:31.38][04:01.40][01:57.43]我一直在你身旁 從未走遠

[04:39.55][04:09.00][02:07.85]

"""time_list = #得到時間的列表

sleep_time = #停頓時間

musicdicet = {}#字典儲存資料

time_miao = #得到時間的列表

fist_splines = #第一次切割之後的資料

fist_splines = musiclrc.splitlines() #得到一行一行的資料了

for x in fist_splines: #對其一行行的讀取

time_num = x.count("[") #time_num這個是統計一行中有多少個時間資料

x = x.replace("[", "") #去掉資料裡的" [ "

fist_splines = x.split("]") #分隔資料

#在這裡 我們如果時間列表中有空格什麼的 我們可以用 strip對資料進行處理要不下邊的資料處理會出錯,這#裡沒有空格 就沒有處理,也可以用替換的方法 將空格替換成空字元處理

for y in range(time_num): #通過for迴圈將一行中的是所有時間當成key存到字典中

musicdicet[fist_splines[y]] = fist_splines[-1]

fen = int(fist_splines[y][:2]) #為了方便這裡就用切片處理,可以使用分隔得到列表在進行處理

miao = float(fist_splines[y][3:]) #得到的是 分鐘 和 秒

time_miao = sorted(time_miao) # 這個時候我們得到的是乙個無序的秒列表 需要對秒進行排序

for x in range(len(time_miao)): #得到是停頓的時間

if x == 0: #當他是第乙個的時候 我們第一次停的時間是他本身

else:

musicdicet = sorted(musicdicet.items(), key=lambda e:e[0])#對字典按照key值進行排序 得到的是list 裡面是元組 這裡注意 字典輸出時是有序的 但是它的儲存是無序的

for x,y in enumerate(musicdicet): #返回下標和元組,sleep_time 來停止時間進行輸出。

time.sleep(sleep_time[x])

print(y[0],y[1])

以上就是整個程式的流程,我們在解決問題的時候要有邏輯思維,這種邏輯思維最好的訓練方法就是逆推的辦法,

比如在這個程式中,我們想要歌詞按時間列印,首先我們就要得到停頓時間才能按時間列印,其次我們列印的時候要得到時間的資料和歌詞的資料,得到時間的資料和歌詞的資料我們就要對資料進行處理從中得到想要的資料,所以需要將每一行的資料分隔成時間和歌詞,我們需要得到每行的資料就需要對字串分隔處理得到每行的資料。

所有的程式按照從上到下的順序可能沒有思路,我們可以從需求到推出我們一步步需要做什麼這樣的話就把問題解決了

**中可能有不足的地方,不過基本的功能實現了,我也對其稍微的優化了。

Python 利用pymmseq cpp實現分詞

在python這pymmseg cpp 還是十分方便的!環境 ubuntu10.04 python2.65 步驟 2 tar zxf pymmseg cpp tar.gz 解壓後得到pymmseg 目錄 cd pymmseg mmseg cpp python build.py 生成 mmseg.so...

Python基礎3 基礎資料型別和格式化輸出

1.int 整數 1 2 3 30 可以進行 等等運算 2.str 字串 你好小老弟 儲存少量的資料。可以與int相乘 str之間可以相加,切片,和其他操作方式 3.bool 布林值 true false 可以判斷真假 4.list 列表 12,true,li 1,23 可以儲存大量的資料 5.tu...

利用Python實現氣泡排序

今天說乙個比較簡單易懂的演算法,相信大家在大學裡面肯定都有接觸過。在這裡介紹排序演算法的一種氣泡排序,對於初學python的新人來說因該很容易理解。排序顧名思義,對給定的一串字元 其實也不一定是字元,可以是其他可比較的元素 按照從大到小或者從小到大的順序排列。演算法原理 1.從第一位開始比較相鄰的兩...