2015-05-27 21 views
0

我處理列表:如果類型不是字符串工作不正常

text = ['package1:', 'package2:', 'package1,', ['package2', 'package4'], 'package3:', ['package2', 'package1,'], ['package3', 'package10,'], 'package60'] 

什麼,我想要做的工作是在一側的字符串,在其他的子列表。

如果我寫:

for i in range(len(text)): 
    print(type(text[i])) 
    if text[i] != str: 
     print(text[i],'Not String') 
    else: 
     print(text[i],'String') 

輸出如下

<class 'str'> 
package1: Not String 
<class 'str'> 
package2: Not String 
<class 'str'> 
package1, Not String 
<class 'list'> 
['package2', 'package4'] Not String 
<class 'str'> 
package3: Not String 
<class 'list'> 
['package2', 'package1,'] Not String 
<class 'list'> 
['package3', 'package10,'] Not String 
<class 'str'> 
package60 Not String 

因爲package1:實際上是一個字符串,它是不正確的。

我的錯誤在哪裏?

回答

6
print(type(text[i])) 
if text[i] != str: 

您打印type(text[i])(類型),但與類型比較text[i](值)。所以當然你最終得到的結果似乎沒有意義。只需將其類型與str進行比較即可使用。

話雖這麼說,檢查一類推薦的方法是使用isinstance

if isinstance(text[i], str): 
    print(text[i], 'String') 
else: 
    print(text[i], 'Not String') 
+0

對於python2,使用'basestring'作爲'isinstance()'的第二個參數。它是'str'和'unicode'的普通類。 –

+0

@ŁukaszR:除非你真的只想測試'str',而不是兩種類型,當然。 – abarnert

0

你可以改變你,如果條件在for循環這樣

for i in range(len(text)): 
    print(type(text[i])) 
    if type(text[i]) != str: 
     print(text[i],'Not String') 
    else: 
     print(text[i],'String') 

我不知道,但我認爲這是對您有所幫助。

+0

談到優化,代碼可以在兩線是合適的。如果是isinstance(item,str)else'Not string')''' –

+0

@IgorPomaranskiy那不會''''print'(type(item),item,'String'真的讓代碼更好。 – poke