1. 程式人生 > >CheckIO題解:OLD LIBRAY 裡的部分題目

CheckIO題解:OLD LIBRAY 裡的部分題目

這裡只有OLD LIBRAY 裡的部分題目,其他的還沒做。

Dot in numbers

我的方法就一行:

re.sub(r'(\d)(?=(\d\d\d)+(?!(\d|th)))', r'\1.', txt)
用到正則表示式裡環視功能。具體可以參考《精通正則表示式》的環視部分章節。

簡單來說就是,匹配一個數字後有且僅有3的倍數個數字的位置

All in row

def checkio(arr):
    'convert all elements in arr in one row'
    l = [i for i in list_iter(arr)]
    return l

def list_iter(nested):
    try:
        for sublist in nested:
            for element in list_iter(sublist):
                yield element
    except TypeError:
        yield nested

這裡用到了生成器,可以參考《Python基礎教程》裡遞迴生成器部分。

程式碼裡精煉的使用try、except 而不必使用 if isinstance() 也是參考的書上的例子。

Transposed Matrix

#最短的方法
list(map(list, zip(*matr)))
#我的方法
[[matr[i][j] for i in range(len(matr))] for j in range(len(matr[0]))]
這裡是我沒有理解內建函式zip,以至於寫了這幾層巢狀。
zip()函式接受多個列表作為引數,將各個列表的元素按相同索引組成組元並形成新的列表。各個組元的長度為引數中最短的列表長。如:
>>> list(zip(['a', 'b'], [1, 2], ['c', 'd', 'e']))
[('a', 1, 'c'), ('b', 2, 'd')]