竟然有人把 Sudoku 推上來。 ((據聞有人可以一行搞掂這個 sudoku 。)) 那就不如又順手用那個例子講下 Python 。
我覺得 Python 的兩種 data structure 是非常好用,一是 list ,另一是 dict 。
最近報了的 udacity course 近乎濫用 list comprehension 功能,我也要令自己理解它在做甚麼。在理解 list comprehension 之前,可以先看看 map 這個功能。
例如有個 list [1, 2, 3, 4] ,你想每個 item 都乘 2 。當然可以用 for loop 及 append 。
[code]
somelist = [1, 2, 3, 4]
dlblist = []
for item in somelist:
dlblist.append(item * 2)
[/code]
據聞這個方法是很慢的,是否如此我並不知道。
另一個做法是用 functional programming 常用到的 map 。例如:
[code]
somelist = [1, 2, 3, 4]
def doubleup(x):
return x * 2
dlblist = map(doubleup, somelist)
[/code]
更似 functional programming 的方法,是用 lambda 。那就連 doubleup 的 function 都不用 define 。例如:
[code]
somelist = [1, 2, 3, 4]
dlblist = map(lambda x: x * 2, somelist)
[/code]
所謂的 list comprehension ,正正就像是用 map 加 lambda 那樣,只不過看上去好似易看一些。
[code]
somelist = [1, 2, 3, 4]
dlblist = [item * 2 for item in somelist]
[/code]
原來的 sudoku 問題有 transpose function ,樣子如此:
[code]
def transpose(sudoku):
# nrow of the sudoku
tsudoku = []
nrow = len(sudoku)
for i in range(0,nrow):
colvec = []
for j in range(0,nrow):
colvec.append(sudoku[j][i])
tsudoku.append(colvec)
return tsudoku
[/code]
如用到 list comprehension 是可以變成這樣的 one-liner :
[code]
def transpose(sudoku):
return [[sudoku[j][i] for j in range(0, len(sudoku))] for i in range(0, len(sudoku))]
[/code]
但這是否 readable 我就不清楚了。