if和For语句的花式反向语法

时间:2012-10-19 03:32:39

标签: python

我经常看到类似的代码:

return [(var, val) for val in self.domains[var]
                    if self.nconflicts(var, val, assignment) == 0]

我就像DAMN那样性感。但后来我尝试删除它,我得到语法错误。这种优秀的代码编写方式是否有任何特定的规则可以反转forif语句的典型位置?

4 个答案:

答案 0 :(得分:5)

他们被称为list comprehensions。基本语法是(我使用parens来分组我的单词,而不是语法的一部分):

[(an expression involving x) for x in someList if (some condition)]

如果condition的计算结果为true,则结果列表包含(expression involving x)。因此,例如,以下列表推导使用此选项仅在结果列表中包含字符串。

>>> myList = [1,"hello",5.4,"world"]
>>> [elem for elem in myList if type(elem)==str]
['hello', 'world']

请注意,if部分是可选的,expression involving x可以像x一样简单(通常在您从其他列表中过滤掉元素时使用)。

事实上,expression involving x根本不必包含x。例如,如果出于某种原因,只要您的名字需要0列表,就可以执行此操作:

>>> [0 for letter in "Matthew"]
[0, 0, 0, 0, 0, 0, 0]

如果您在制作列表后不需要列表,请改用generator expressions。 (生成器表达式和列表推导具有相同的语法。)

答案 1 :(得分:2)

请参阅Python教程文档中的list comprehensions。您可以使用此语法执行许多操作,包括创建列表,集和字典。

答案 2 :(得分:2)

答案 3 :(得分:2)

虽然您的示例代码确实是列表推导,但您偶尔也会看到内联条件语法的反向语法:

a if b else c