2011-12-22 46 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 
相关问题