我有一个循环条件,我想转换成列表理解。我只想学习如何将复杂的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}}
答案 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的三角形,而不是添加。