2014-04-04 53 views
0

根據the documentation,「將空字符串或只包含空格的字符串拆分爲無分隔符返回[]」。在列表理解中如何分裂返回元素返回一個空括號?

>>> [i.split() for i in input()] 
1 2 
[['1'], [], ['2']] 

然而,interingly足夠:

>>> [i for i in input().split()] 
1 2 
['1', '2'] 

這使我們推斷這在原來的例子創建空的列表中沒有一個是本身並不是分裂,或輸入的結果(),但列表理解。

我讀了所有documentation上的列表理解,它沒有透露答案。

+2

這與列表理解不相干。您正在迭代並與不同的對象進行交互。 –

+0

詳細說明@AlexThornton的說法,第一種情況是字符串,第二種是列表。 – devnull

回答

2

您正在遍歷一個字符串;就像在一個字符串調用list(),迭代產生單個字符

>>> list('1 2') 
['1', ' ', '2'] 
>>> [c for c in '1 2'] 
['1', ' ', '2'] 

你然後將str.split()每個個性:

>>> '1'.split() 
['1'] 
>>> ' '.split() 
[] 
>>> '2'.split() 
['2'] 

中間的字符是一個空間,所以str.split()行爲準確爲廣告。

根本不需要列表理解。通過一個

>>> input().split() 
1 2 
['1', '2'] 

你所有的第二個例子確實是環比由str.split()調用生成的列表和重複的元素,一個:剛剛拆由input()返回的字符串

>>> [i for i in ['1', '2']] 
['1', '2'] 
2

它不是與列表理解做。您正在迭代並與不同的對象類型進行交互。


在第一示例中,將迭代的字符串,所以'1 2'元素是['1', ' ', '2']。只有然後你是否分割它們,返回指定的輸出。查看顯示的文檔,我們現在知道爲什麼在第一個示例中返回空列表。

>>> [c for c in '1 2'] 
['1', ' ', '2'] 

然而,在第二個例子中,你迭代input().split(),這是一個列表。這可以正常工作,因爲'1 2'不是空字符串。因此,.split()返回一個元素列表,默認情況下以空格分割。

>>> '1 2'.split() 
>>> ['1', '2']