字串 to list

list()

使用 list() 方法做「轉型」時一定要注意會用什麼形式轉換,以下是一個將字串轉為 list 錯誤的方式

>>> s = input()
rilak achin water.m hortune
>>> staff = list(s)
>>> staff
['r', 'i', 'l', 'a', 'k', ' ', 'a', 'c', 'h', 'i', 'n', ' ', 'w', 'a', 't', 'e', 'r', '.', 'm', ' ', 'h', 'o', 'r', 't', 'u', 'n', 'e']

我原本希望能得到 ['rilak', 'achin' ... ] 這樣的list, 但他卻將字串內的每一個「字」都變成一個元素。這其實不是一個意外的結果,因為 str 變數預設的迭代方式就是切成一個一個字母。

>>> for i in "rilak":
...     print(i)
... 
r
i
l
a
k

使用 ipython 可以看到對 list 方法的說明文件:

In [2]: list?
Init signature: list(self, /, *args, **kwargs)
Docstring:     
list() -> new empty list
list(iterable) -> new list initialized from iterable's items
Type:           type

請特別注意這一句: list(iterable) -> new list initialized from iterable's items ,這個就說明了他會按照 iterable 的迭代方式做初始化。

字串.split()

回過頭來處理剛開始的問題,我們要把 rilak achin water.m hortune 開。

>>> s = input()
rilak achin water.m hortune
>>> staff = s.split()
>>> staff
['rilak', 'achin', 'water.m', 'hortune']

呼叫 split() 方法會回傳一個 list ,預設是按照空白切開。

如果要指定按照「某個字母或單字切開」可以在split()內指定:

>>> lyrics = "<br>電影 擺渡人 主題曲<br>作詞:唐漢霄<br>作曲:唐漢霄<br><br>我從來不說話<br>因為我害怕 沒有人回答<br>我從來不掙扎<br>因為我知道 這世界太大<br><br>太多時間浪費 太多事要面對<br>太多已無所謂 太多難辨真偽<br>太多紛擾是非 在你身 邊是誰<br><br>最渺小的我 有大大的夢<br>時間向前走一定只有路口沒有盡頭<br>紛紛擾 擾這個世界 所有的了解<br>只要 讓我留在你身邊<br><br>最渺小的我 有大大的夢<br>我 願意安靜的活在每個有你的角落<br>如果生活還有什麼 會讓你難過<br>別怕 讓我留在你身邊 都陪你渡過<br><br>"

>>> sentences = lyrics.split('<br>')
>>> sentences
['', '電影 擺渡人 主題曲', '作詞:唐漢霄', '作曲:唐漢霄', '', '我從來不說話', '因為我害怕 沒有人回答', '我從來不掙扎', '因為我知道 這世界太大', '', '太多時間浪費 太多事要面對', '太多已無所謂 太多難辨真偽', '太多紛擾是非 在你身邊是誰', '', '最渺小的我 有大大的夢', '時間向前走一定只有路口沒有盡頭', '紛紛擾擾這個世界 所有的了解', '只要 讓我留在你身邊', '', '最渺小的我 有大大的夢', '我願意安靜的活在每個有你的角落', '如果生活還有什麼 會讓你難過', '別怕 讓我留在你身邊 都陪你渡過', '', '']

假設我們從網路上用程式抓下了一段HTML,接下來要把裡面的歌詞一句一句抓出來,我們就直接使用 '<br>' 作為分割的依據。

你可能會想要刪除裡面的空字串:

>>> temp = []
>>> for sentence in sentences:
...     if sentence != "":
...         temp.append(sentence)
... 
>>> temp
['電影 擺渡人 主題曲', '作詞:唐漢霄', '作曲:唐漢霄', '我從來不說話', '因為我害怕 沒有人回答', '我從來不掙扎', '因為我知道 這世界太大', '太多時間浪費 太多事要面對', '太多已無所謂 太多難辨真偽', '太多紛擾是非 在你身邊是誰', '最渺小的我 有大大的夢', '時間向前走一定只有路口沒有盡頭', '紛紛擾擾這個世界 所有的了解', '只要 讓我留在你身邊', '最渺小的我 有大大的夢', '我願意安靜的活在每個有你的角落', '如果生活還有什麼 會讓你難過', '別怕 讓我留在你身邊 都陪你渡過']
>>> sentences = temp

或是使用 list comprehension 的語法。

>>> sentences = lyrics.split('<br>')
>>> sentences = [x for x in sentences if x != ""]
>>> sentences
['電影 擺渡人 主題曲', '作詞:唐漢霄', '作曲:唐漢霄', '我從來不說話', '因為我害怕 沒有人回答', '我從來不掙扎', '因為我知道 這世界太大', '太多時間浪費 太多事要面對', '太多已無所謂 太多難辨真偽', '太多紛擾是非 在你身邊是誰', '最渺小的我 有大大的夢', '時間向前走一定只有路口沒有盡頭', '紛紛擾擾這個世界 所有的了解', '只要 讓我留在你身邊', '最渺小的我 有大大的夢', '我願意安靜的活在每個有你的角落', '如果生活還有什麼 會讓你難過', '別怕 讓我留在你身邊 都陪你渡過']
>>>

注意陷阱(?)

>>> s = "A    B" #有四個空白
>>> s.split()
['A', 'B']
>>> s.split(' ')
['A', '', '', '', 'B']
>>>

split()split(' ') 不一樣喔。

章節回顧

  • list() : 回傳一個空的 list
  • list(可迭代變數) : 把每一個迭代的東西做成 list
  • str.split() : 用空白把字串切開,兩個空白之間不會切出空字串
  • str.split(分割字) : 按照分割字把字串切開,可能會切出空字串

results matching ""

    No results matching ""