Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将for循环转换为列表理解_Python_List_Python 2.7_List Comprehension - Fatal编程技术网

Python 将for循环转换为列表理解

Python 将for循环转换为列表理解,python,list,python-2.7,list-comprehension,Python,List,Python 2.7,List Comprehension,我有一个循环条件,我想转换成列表理解。我只是想学习如何将复杂for循环写入一行 num = [] for i in range(2, numRows): row = [] for j in range(i - 1): row.append(sum(num[-1][j:j + 2])) num.append([1] + row + [1]) 我认为列表理解只能与ifelse条件一起使用。我们能在里面写正则表达式吗?有人能告诉我这是否可能吗?下面的代码不适用

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

num = []
for i in range(2, numRows):
    row = []
    for j in range(i - 1):
        row.append(sum(num[-1][j:j + 2]))
    num.append([1] + row + [1])
我认为
列表理解
只能与
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)]
编辑:我的Pascal三角形的初始代码

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

看起来你想做帕斯卡三角形。要使第一个代码块中的代码正常工作,您需要正确初始化
num

num = [[1,1]]
在列表中生成Pascal三角形是不实际的,因为要生成每一行,您需要访问前一行。但是,使用“传统”的
for
循环和使用
zip
创建需要添加的数字对的列表comp组合很容易

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    
我在您的列表comp尝试中看到您正在使用
行。append
。请不要那样做。
list.append
方法返回
None
,因此在列表comp中调用它会创建一个充满
None
s的列表。当然,这是合法的Python,并且在某些情况下,您可能能够以这样的方式计算期望的结果,但是大多数有经验的Python程序员认为滥用列表COMPs是不好的做法。当您需要它们生成的实际列表时,可以使用它们,而不仅仅是将
for
循环到一行的一种方式

别误会,我喜欢列表理解和生成器表达式。虽然它们一开始可能有点令人困惑,但一旦你习惯了它们,它们就会简洁紧凑。与传统的
for
循环中使用
.append
相比,列表comp的效率略高。然而,即使是最有经验的Pythonista,也很难读懂深度嵌套/复杂的列表comp和gen表达式。因此,不要试图在它们中塞进太多内容,如果这样可以使代码更具可读性,那么就毫不犹豫地将它们分为多个阶段



*实际上,使用公式,而不是加法,可以在列表comp中生成Pascal三角形。

为什么您认为列表理解可以为您提供更好的可读性?即使有可能在列表比较中做到这一点,也很难阅读。我只是想学习如何将复杂的
循环条件
转化为列表理解。我认为
可读性
在这里不是合适的词。例如
[I For I in words[index:]For index,j in enumerate(words)]
但这是一个简单的词!从技术上讲,您可以通过简单的
行=[]
来重现这个过程,因为您在外部循环的每次迭代之后都会进行重新分配,将所有内容都清除掉。你为什么要这样做?我是说,你可以在一行中写下整件事,使用
行=[]
,因为每次循环中的重新分配都会丢弃所有以前的工作,所以这就是你最终得到的结果。另外,不,这个特殊的结构减去尾随的
行=[]
不能理解,因为它有对自身的引用(尽管我打赌有一些可怕的黑客使其工作)。回答很好!还更新了我的pascal三角形代码。我只是想把它简短一点,用一行字写出来。@python谢谢!FWIW,您可以通过使用
sum
来缩短我代码中的主要计算,但我怀疑它是否更有效,因为它涉及一个额外的函数调用:
row=[sum(t)for t in zip([0]+row,row+[0])]