2011-12-22 62 views
0

我試圖做這樣的事情在python以下,但我得到一個無效的語法錯誤:如果在列表中對每個項目的發言

network_n = 192.168.38 
octate_n = network_n.split(".") 
if (len(o) [for o in octate_n]) == 3: 

但是當我運行它,我得到:

if (len(o) [for o in octate_n]) == 3: 
       ^
SyntaxError: invalid syntax 

我的問題是與if語句,那裏有什麼錯?

我承認我對if語句中的()[]之間的區別有一個大概的想法,所以我很高興你給我一個關於它的簡短解釋。

+0

你的意思是'network_n =「192.168.38」'? – 2011-12-22 15:07:23

回答

6

使用all

if(all(len(o) == 3 for o in octate_n)): 
    # do stuff 

關於你秒的問題,[o for o in octate_n]創建於octate_n包括所有項目(這被稱爲list comprehension)的列表,而(o for o in octate_n)創建generator,將產生的所有項目octate_n(這稱爲generator expression)。

0

您在列表的單個元素上使用len。 Emm ..不..你在沒有定義的元素上使用len(o)。 使用:

if (len(octate_n) == 3: 

對不起,有你的想法。如果你想檢查列表中的所有元素長度是3個字符 - 使用「all」,如下面的答案。

+1

這不是OP的意圖。他想檢查IP地址的每個部分是否有三位數字。另外,[不匹配的括號](http://xkcd.com/859/)! – 2011-12-22 07:26:38

+0

剛剛得到它。謝謝。 – 2011-12-22 07:28:24

2

嗯,我可以告訴你你的條件語法有什麼問題:你至少需要在括號內包含len(o)

[len(o) for o in octate_n] 

這種結構,[expr for var in list],被稱爲列表理解,這是一個速記「爲list每個元素評估expr,與var集的元素,使結果的新名單。」在您的原始代碼中,您沒有任何expr這就是Python抱怨的原因。現在

,即使你解決這個問題,你風與

if [len(o) for o in octate_n] == 3: 

仍然有您的列表比較了一些問題。雖然你可以在技術上做到這一點,但這可能並不意味着你的期望:一個列表永遠不會等於一個數字,因爲它們是不同的對象。不過,你還不清楚你在做什麼。如果你想找到列表中的所有元素是否有長度等於3,你會寫

if all([len(o) == 3 for o in octate_n]): 

,或者更有效,

if all(len(o) == 3 for o in octate_n): 

注意在沒有方括號後面的聲明。這是因爲您實際上並不需要在結果中列出列表;你只需要能夠一次一個地檢查他們,並檢查它們是否都是真實的。省略括號是什麼表示這對Python。 (你只能在括號內做到這一點。)

0

我不確定你的問題到底是什麼。這裏有一堆的可能性:

如果你想有長度爲3的的octate_n所有成員返回:

with_len_3 = [o for o in octate_n if len(o) == 3] 

如果你想確保有3個在octate_n元素:

if len([o for o in octate_n]) == 3: 
    # do stuff 

這是一樣的

if len(octate_n) == 3: 
    # do stuff 

如果你想確保所有在octate_n元素都是一個長度爲3:

if(all(len(o) == 3 for o in octate_n)): 
    # do stuff 

這是一個更清潔,更快的版本:

if len([o for o in octate_n if len(o) == 3]) == len(octate_n): 
    # do stuff 
相關問題