2012年5月30日水曜日

初めてのコンピュータサイエンス第10章解答

第10章の解答。以下ネタバレなので、読みたくない方は立ち去りましょう。問題文は載せませんので悪しからず。必要なら買いましょう。その前にこの章の個人的なメモ。

  • pythonにおけるリストのコピーはList[:]のように、全体をスライシングする書き方にすればよい。

1

a)b)の解答

空の文字列を用意して、AであればT、TであればA、GであればC、CであればGを結合することを文字列の末尾まで続ける。

c)の解答

def complement(sequence):
    ret = ''
    for c in sequence:
        if c == 'A':
            ret += 'T'
        elif c == 'T':
            ret += 'A'
        elif c == 'G':
            ret += 'C'
        elif c == 'C':
            ret += 'G'

    return ret

if __name__ == '__main__':
    print complement('AATTGCCGT')

2

a)~c)までまとめて解答。a)の解答はmin_index関数の内部そのものになります。また、引数にboolというものを取れいう指示があるのですが、boolは予約語なので、booleanに変更。

def min_index(sequence):
    idx = 1
    val = sequence[0]
    for i in range(2, len(sequence)):
        if sequence[i] < val:
            val = sequence[i]
            idx = i
    return tuple((val, idx))

def max_index(sequence):
    idx = 1
    val = sequence[0]
    for i in range(2, len(sequence)):
        if sequence[i] > val:
            val = sequence[i]
            idx = i
    return tuple((val, idx))

def min_or_max_index(sequence, boolean):
    if boolean == True:
        return max_index(sequence)
    else:
        return min_index(sequence)

if __name__ == '__main__':
    data = [3, 7, 2, 0, 23.1, 1.4, 9]
    print min_index(data)
    print min_or_max_index(data, False)
    print min_or_max_index(data, True)

3

どこまでを仕様とするかにも依るが、面白いリストには、例えば長さ0や長さ1のリスト、最小値が先頭にあるリスト、文字列を含むリストというのも考えられる。最小値が先頭にある場合は、初期設定で最小値を先頭の値としている場合に対応するためのテストである。以下のコードでは、前提として、長さが1以上、文字列は一切含まないものとしてテストを行うものである。ex10_2は2番のコードである。

import nose
from ex10_2 import min_index

def test_min_index():
    data = [1, 100]
    assert min_index(data) == tuple((1, 0))
    data = [3]
    assert min_index(data) == tuple((3, 0))

if __name__ == '__main__':
    test_min_index()

4

最小の2つの要素を探すのに、0または1つの要素からなるリストを与えられた場合は、そのようなものは「ない」ということで、Noneを返す。もしくは添字アクセスに失敗することから、例外を返すというのが考えられる。はじめの先頭2要素の比較で、アクセスしようとしている添字が存在していないことが問題になることに注意。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計