Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

コロンの使い方の小ネタ

CodeSnippetsのPythonカテゴリをぼーっと眺めてたら面白い書き方を見つけました。
http://www.bigbold.com/snippets/tag/python/

あるリストの逆順を得たい時、ふつうこんな感じで

>> a = [1, 2, 3, 4, 5, 6]
>> a.reverse()
>> print a
[6, 5, 4, 3, 2, 1]

書きますが、reverseは破壊的メソッドなので場合によってはイヤンな感じ。ですが次のようにかけば大丈夫。

>> a = [1, 2, 3, 4, 5, 6]
>> a[::-1]
[6, 5, 4, 3, 2, 1]

ちなみに、a[::2]だと[1, 3, 5]、a[::3]だと[1,4]が返ってきます。初めて知った。ちょっとおもしろい。
で、これを使ってちょっとコード書いてみたくなったので(手段のために目的がある。。)書いてみました。

m = [1,2,3,
     4,5,6,
     7,8,9,]
print group_row(m, 3)
print group_column(m, 3)

と、やると

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

こんなリストが返ってくるサンプルコードです。

def group_row(lst, n):
    l, result = lst[:], []
    while l:
        result.append(l[:n])
        l = l[n:]
    return result

def group_column(lst, n):
    l, result = lst[:], []
    for i in range(n):
        result.append(l[::n])
        l.pop(0)
    return result

追記:
いじってたら両方とも一行でかけてしまった。。。すごいなPython。てかちょっと変態っぽいか、、これは。

def group_row(lst, n):
    return [lst[i:i+n] for i in range(len(lst))[::n]]

def group_column(lst, n):
    return [lst[i::n] for i in range(n)]