将列表理解表达式拆分成多行以了解更好的情况?

时间:2017-11-08 20:15:01

标签: python function list-comprehension

我试图更好地理解一些代码,并且有一行正在做一些我不完全理解的事情。我想知道是否有办法将其分成多行,这样我就可以更好地了解每一步中发生的事情。

这段代码是一个函数和一长串代码(很多行)的一部分,因此当这只是一行时,将整个代码粘贴到这里有点困难。但是,如果需要,我可以这样做或以某种方式附加代码。我正在谈论的这一行是一个函数,当给定部分赋值时,它返回完整的赋值。它如下:

return min([(sum([int(self.get_weight(assign, var, action)>0) for action in self.domains[var]]), var) for var in self.my_function if var not in assign])[1]        

这些是调用一堆先前编码的权重等等。我只是问你如何将这个表达式分成多行。我的一些想法是:

for var in self.my_function:
    if var not in assign:
        for action in self.domains...

有关如何做到这一点的任何想法?当我尝试这样的事情时,我看到了一个错误,"不可用的类型:list",所以我知道它的表达方式并不完全相同。谢谢!

3 个答案:

答案 0 :(得分:3)

首先将原始代码分成多行:

min([
    (
        sum([
            int(self.get_weight(assign, var, action)>0) for action in self.domains[var]
        ]), var
    ) for var in self.my_function if var not in assign
])[1]  

可以改写为:

list_to_take_min_of = []

for var in self.my_function:
    if var not in assign:
        weights = []
        for action in self.domains[var]:
            weights.append(int(self.get_weight(assign, var, action)>0))
        list_to_take_min_of.append((sum(weights), var))

min(list_to_take_min_of)[1]

答案 1 :(得分:1)

您也可以将原始代码拆分为多行以方便阅读:

return min([(sum([int(self.get_weight(assign, var, action)>0) \
    for action in self.domains[var]]), var) \
        for var in self.my_function \
            if var not in assign])[1]        

答案 2 :(得分:1)

当分解一个衬里时,我发现一步一步地按照以下模板进行每个嵌套列表理解是有帮助的:

out = [expression(value) for value in iterable if condition]

#becomes

out = []
for value in iterable:
    if condition
        out.append(
            expression(value)
        )

在你的情况下,你有一个嵌套列表理解,所以expression(...)将是这个样板的另一个副本......