我经常看到类似的代码:
return [(var, val) for val in self.domains[var]
if self.nconflicts(var, val, assignment) == 0]
我就像DAMN那样性感。但后来我尝试删除它,我得到语法错误。这种优秀的代码编写方式是否有任何特定的规则可以反转for
和if
语句的典型位置?
答案 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