2017-02-14 45 views
1

爲什麼str.split()刪除Noney項而str.split('')不?爲什麼str.split()刪除Noney項目而str.split('')不?

>>> s = 'this is an irritating string with random spacing .' 
>>> s.strip().split(' ') 
['this', 'is', '', '', 'an', '', '', 'irritating', 'string', 'with', '', 'random', 'spacing', '', '.'] 
>>> s.strip().split() 
['this', 'is', 'an', 'irritating', 'string', 'with', 'random', 'spacing', '.'] 

按照docs

str.split(SEP =無,maxsplit = -1)

如果SEP是給定的,連續的分隔符不組合在一起,並被視爲分隔空字符串(例如,'1,2'.split(',')返回['1','','2'])。 sep參數可以由多個字符組成(例如,'1 <> 2 <> 3'.split('<>')返回['1','2','3'])。用指定分隔符分割空字符串會返回['']。

如果未指定sep或爲None,則應用不同的分割算法:將連續空白的運行視爲單個分隔符,並且如果該字符串具有前導或結果,則開始或結束時不會包含空字符串或尾隨空白。因此,將空字符串或只包含空格的字符串拆分爲無分隔符將返回[]。

所以使用關鍵字參數sep=是在Python的方式來刪除Noney項下?

[w for w in s.strip().split(' ') if w] 

如果它只是空格(\s\t\n),str.split()就足夠了,但可以說我們正在試圖分裂另一個字符/串,在列表理解的,如果條件是必要的。是對的嗎?

+0

無不是空格字符。我甚至不知道Noney是什麼意思,但該方法按照文件記錄。你在字符串中沒有None元素 –

+2

爲什麼不使用'split()'?而且,你究竟在做什麼? –

+0

注意:如果你使用no-arg'split',首先調用'strip'是多餘的; 'split'將會刪除前導和尾部的空白,而不會增加額外的方法調用和臨時的'str'。 – ShadowRanger

回答

1

如果你想成爲鈍角,你可以使用filter(None, x)刪除falsey項目:

>>> list(filter(None, '1,2,,3,'.split(','))) 
['1', '2', '3'] 

大概Python的少。這可能是更清楚的項目具體迭代:

for w in '1,2,,3,'.split(','): 
    if w: 
     … 

這清楚地表明,你跳過空白的項目,而不是依賴於一個事實,即str.split有時跳過空白項目。

我倒寧願使用正則表達式,或者跳過分離器的連續運行(但是要注意結尾):

>>> re.split(r',+', '1,2,,3,') 
['1', '2', '3', ''] 

或應有盡有,這不是一個分隔符:

>>> re.findall(r'[^,]+', '1,2,,3,') 
['1', '2', '3'] 

如果你想要去的方式回到Python的歷史,有兩個單獨的功能,splitsplitfields。我認爲這個名字解釋了目的。第一個分割任何空格,可用於任意文本輸入,第二個可預測分隔輸入。它們在v1.6之前以純Python實現。

0

嗯,我想你可能只是需要一個理解文檔的手。在你的例子中,你幾乎證明了文檔中提到的算法的不同之處。多多少少不使用sep關鍵字參數就像使用sep=' '然後拋出空字符串。如果連續有多個空格,則算法會拆分這些空格並找到None。因爲你明確地表示你希望所有的東西都被一個空格分隔,所以它將None轉換爲一個空字符串。在這種情況下將None更改爲空字符串是很好的做法,因爲它避免了更改函數的簽名(或換句話說,函數返回的內容),在這種情況下,它會返回一個字符串列表。

下面是表示一個空字符串與4位被區別對待......

>>> empty = ' ' 
>>> s = 'this is an irritating string with random spacing .' 
>>> empty.split() 
[] 
>>> empty.split(' ') 
['', '', '', ''] 

對於你的問題,只需使用split()沒有sep參數

-1

以及您的字符串 S =「這是一個具有隨機間距的刺激性字符串', 它包含多個空格,這就是爲什麼empty.split('')正在返回noney值。

你將不得不從字符串s中刪除額外的空白,並可以得到想要的結果。

相關問題