我经常看到类似这样的代码:
return [(var, val) for val in self.domains[var]
if self.nconflicts(var, val, assignment) == 0]
我觉得该死的性感。但后来我有时会尝试删除它,但会出现语法错误。这种很好的代码编写形式是否有任何特殊规则可以颠倒 for
和 if
语句的典型位置?
最佳答案
它们叫做 list comprehensions .基本语法是(我使用括号对我的词进行分组,而不是作为语法的一部分):
[(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 involved x
可以简单到只是 x
(通常在您需要时使用)只是从另一个列表中过滤掉元素)。
事实上,包含 x 的 expression 根本不需要包含
x
。例如,如果出于某种原因你想要一个与你的名字一样长的 0
列表,你可以这样做:
>>> [0 for letter in "Matthew"]
[0, 0, 0, 0, 0, 0, 0]
如果您不需要列表在创建后保留下来,请使用 generator expressions反而。 (生成器表达式和列表理解具有相同的语法。)
关于python - If 和 For 语句的花式反向语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966989/