将for循环转换为列表理解

时间:2015-12-31 00:15:05

标签: python list python-2.7 list-comprehension

我有一个循环条件,我想转换成列表理解。我只想学习如何将复杂的for循环写入一行。

if

我认为else只能与row = [] [num.append([1] + row + [1]) row = [] [row.append(sum(num[-1][j:j + 2])) for j in range(i - 1)]for i in range(2, numRows)] class Solution(object): def generate(self, numRows): """ :type numRows: int :rtype: List[List[int]] if numRows = 5 [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] """ num = [[1], [1, 1]] if numRows == 1: return num[0] elif numRows == 2: return num row = [] for i in range(2, numRows): for j in range(i - 1): row.append(sum(num[-1][j:j + 2])) num.append([1] + row + [1]) row = [] return num 条件一起使用。我们可以在里面写正则表达式吗任何人都可以告诉我是否可能吗?以下代码对我不起作用。

{{1}}

编辑:我最初的Pascal Triangle代码

{{1}}

1 个答案:

答案 0 :(得分:3)

看起来你正试图制作Pascal的三角形。要使第一个代码块中的代码正常工作,您需要正确初始化num

num = [[1,1]]

在列表理解中生成Pascal的三角形是不实际的,因为要生成访问前一行所需的每一行。但是,使用"传统"的组合很容易。 for循环和使用zip创建需要添加的数字对的列表组合。

def pascal(m):
    """ Build m rows of Pascal's triangle """
    row = [1]
    rows = [row]
    for i in xrange(m):
        #Generate next row from current row
        row = [x + y for x, y in zip([0] + row, row + [0])]
        rows.append(row)
    return rows

#test
width = 50
for row in pascal(10):
    print " ".join(["%3d" % x for x in row]).center(width)

<强>输出

                         1                        
                       1   1                      
                     1   2   1                    
                   1   3   3   1                  
                 1   4   6   4   1                
               1   5  10  10   5   1              
             1   6  15  20  15   6   1            
           1   7  21  35  35  21   7   1          
         1   8  28  56  70  56  28   8   1        
       1   9  36  84 126 126  84  36   9   1      
     1  10  45 120 210 252 210 120  45  10   1    

我在您的列表中看到您尝试使用row.append。请不要这样做。 list.append方法返回None,因此在list comp中调用它会创建一个充满None的列表。当然,这是合法的Python,并且在某些情况下,你可能能够以这种方式计算出所需的结果,但是大多数有经验的Python程序员认为滥用列表组件是不好的做法。当你想要它们产生的实际列表时使用它们,而不仅仅是将for循环用作一条线的方法。

不要误解我的意思 - 我喜欢列表推导和生成器表达式。虽然起初它们可能有点令人困惑,但一旦你习惯它们,它们就会简洁紧凑。列表组合比在传统的.append循环中使用for略高效。然而,即使是最有经验的Pythonista,也很难阅读深度嵌套/复杂的列表组合和gen表达式。所以不要试图过多地填充它们,如果它使代码更具可读性,请不要犹豫将它们分成多个阶段。

* 实际上可以使用binomial coefficient公式在列表组件中生成Pascal的三角形,而不是添加。