Python 将for循环转换为列表理解
我有一个循环条件,我想转换成列表理解。我只是想学习如何将复杂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条件一起使用。我们能在里面写正则表达式吗?有人能告诉我这是否可能吗?下面的代码不适用
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])]