« お題4:入れ子リストの中身を順に表示 | メイン | お題6:名簿の並び替え »

お題5:行列の回転

  • 行列(リストのリスト)が与えられたときに、それを90度時計回りに回転した行列を返す下のような関数を作れ。
    >>> rotate([
    	[1, 2, 3],
    	[4, 5, 6],
    	[7, 8, 9]])
    [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
    

  • 与えられた引数が長方形の行列であるか(リストの中のそれぞれのリストが全て同じ長さで、入っているのが数だけであるか)をチェックする関数を作れ。

トラックバック

このエントリーのトラックバックURL:
http://www.nishiohirokazu.org/mt/mt-tb.cgi/602

コメント (6)

R:
def rotate(mtrx):
  return [list(x[::-1]) for x in zip(*mtrix)]
HS:
def rotate(x):
  return map(list, map(reversed, zip(*x)))

HS:
def judge(x):
  return len(zip(*x)) == max(map(len, x))

odz:
def rotater(matrix):
    """
    rotate matrix

    >>> rotater([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
    """
    return [list(row) for row in zip(*reversed(matrix))]

NUMBER_CLASSES = [int, float, long]
def isnumber(obj):
    return any(isinstance(obj, cls) for cls in NUMBER_CLASSES)

def is_square_matrix(matrix):
    """
    return if matrix is sauare matrix and includes integer only.
    >>> is_square_matrix([[1, 2], [3, 4]])
    True

    >>> is_square_matrix([[1, 2], [3, 4, 5]])
    False

    >>> is_square_matrix([[1, 2], [3, 4], [5, 6]])
    False

    >>> is_square_matrix([[1], [2, 3]])
    False

    >>> is_square_matrix([[1]])
    True

    >>> is_square_matrix([['1', 2], [3, 4]])
    False

    >>> is_square_matrix([[1.0, 2], [3, 4.0]])
    True
    """
    n = len(matrix)
    return all(len(row) == n for row in matrix) and \
           all(all(isnumber(e) for e in row) for row in matrix)

def _test():
    import doctest
    doctest.testmod()

if __name__ == '__main__':
    _test()

#愚直に
def rotate(li):
    li = apply(zip,li)
    lj = []
    for i in li:
        lj.append(list(i)[::-1])
    return lj

def is_square_matrix(li):
    rl = len(li)
    for row in li:
        if rl != len(row):
            return False
        for v in row:
            if not isinstance(v,int):
                return False
    return True

def main():
    li = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]
    print rotate(li)
    print is_square_matrix(li)
    print is_square_matrix([[1]])
    print is_square_matrix([[1,2],[1,2],[1,2]])

if __name__ == '__main__':
    main()
投稿ミスしました……。
こちらでお願いします。

#愚直に
def rotate(li):
    li = zip(*li)
    lj = []
    for i in li:
        lj.append(list(i)[::-1])
    return lj

def is_square_matrix(li):
    rl = len(li)
    for row in li:
        if rl != len(row):
            return False
        for v in row:
            for cls in [int,float,long]:
                if isinstance(v,cls):
                    break
            else:
                return False
    return True

def main():
    li = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]
    print rotate(li)
    print is_square_matrix(li)
    print is_square_matrix([[1.0]])
    print is_square_matrix([[1,2],[1,2],[1,2]])

if __name__ == '__main__':
    main()

コメントを投稿

About

2007年06月11日 19:00に投稿されたエントリーのページです。

ひとつ前の投稿は「お題4:入れ子リストの中身を順に表示」です。

次の投稿は「お題6:名簿の並び替え」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34