Python

【教科書解説】Pythonプログラミング入門 (CHAPTER 7 リスト (list)) 練習問題

Pythonプログラミング入門」は、東大・京大のプログラミングの授業でも使用されており、無料で読める、東大/京大の「Python教科書」電子書籍で公開されています。

この記事では、CHAPTER 7「リスト(list)」の問題について説明します。

この連載シリーズでは教科書に載っている模範解答を解説し、さらに良い解法がある場合には別解として紹介しています
練習問題を解いてみて、「自分の回答も合っているのではないか?」という方にも参考になると思います。

教科書のHTML版やPDF版のリンクも紹介していますので、ぜひご活用ください。(この記事ではPDF版の章立てを基準にしています)
教材リンクはこちら↓

7.2 練習 remove_evenindex

問題

リスト ln を引数として取り、ln の偶数番目のインデックスの値を削除したリストを返す関数
remove_evenindex を作成してください(ただし、0 は偶数として扱うものとします)。

ヒント:スライスを使います。

7.2 解答

教科書に載っている模範解答は以下の通りになります。

スライスを使って奇数番目のインデックスの値のみを取り出す処理になっており、ほぼ完璧な解答になっています。

def remove_evenindex(ln):
    ln2 = ln[1::2]
    return ln2

別解1

内容は模範解答と同じですが、ln2を使わずに一行で書いた方がよりシンプルです。

def remove_evenindex(ln):
    return ln[1::2]

7.7.1 練習 change_domain

問題

email アドレス email とドメイン名 domain を引数に取って、email のドメイン名を domain に置き換える関数 change_domain(email, domain) を作成してください。

なお、email アドレスのドメイン名とは、'@' で区切られた右側の部分を意味します。

7.7.1 解答

email.split('@')[0] で emailの @から前の文字列のみを取得します。

'@'.join を使って、「@から前の文字列」 と 「domain」 @を区切り文字として連結させています。

def change_domain(email, domain):
    return '@'.join([email.split('@')[0], domain])

別解1

リストのスライスを使って処理することも出来ます。

list(email)[:email.index('@') + 1]) は、文字列の先頭から@までの文字列(@を含む)を取得します。

''.join を使って、「文字列の先頭から@までの文字列」 と 「domain」を連結させています。

def change_domain(email, domain):
    return ''.join(list(email)[:email.index('@') + 1]) + domain

7.9 練習 reverse_totuple

問題

整数の要素からなるリスト ln を引数として取り、 ln に含まれる要素を逆順に格納したタプルを返す関数

reverse_totuple を作成してください。

7.9 解答

ln.reverse() でリストの要素を逆順にします。

その後、逆順にしたリスト(ln)を元に 組み込み関数 tuple でタプルを作成します。

def reverse_totuple(ln):
    ln.reverse()
    tup = tuple(ln)
    return tup

別解1

組み込み関数 reversed組み込み関数 tuple を使って1行で処理を書けます。

def reverse_totuple(ln):
    return tuple(reversed(ln))

別解2

組み込み関数 reversed()の代わりに sorted(ln, reverse=True) で逆順にすることも出来ます。

def reverse_totuple(ln):
    return tuple(sorted(ln, reverse=True))

7.13 練習 sum_list

問題

整数の要素からなるリスト ln を引数として取り、ln の要素の総和を返す関数 sum_list を作成してください。

7.13 解答

forループを使った単純な手法で、分かりやすいですが綺麗なコードとは言えないです。

def sum_list(ln):
    int_sum = 0
    for value in ln:
        int_sum += value
    return int_sum

別解1

組み込み関数 sum を使うことが出来ます。

sumはリスト(ln)の総和を返してくれる便利な関数です。

def sum_list(ln):
    return sum(ln)

7.15 練習 atgc_countlist

問題

ATGC の 4 種類の文字から成る文字列 str_atgc が引数として与えられたとき、次のようなリストlist_count を返す関数 atgc_countlist を作成してください。ただし、 list_count の要素は、各塩基 bp に対して str_atgc 中の bp の出現回数と bp の名前を格納した(長さ 2 の)リストとします。

ヒント:文字列 'ATGC' に対する繰り返しを用いることができます。

7.15 解答

模範解答のfor value in 'ATGC' という処理は、ループごとに Aの個数、Tの個数、Gの個数、Cの個数をそれぞれカウントしています。(全部で4回のループ)

比較的分かりやすく、良い手法だと思います。

def atgc_countlist(str_atgc):
    list_count = []
    for value in 'ATGC':
        int_bpcnt = str_atgc.count(value)
        list_count.append([int_bpcnt, value])
    return list_count

別解1

模範解答より処理が長くなって、劣ると思いますが str_atgc を元にループ処理をすることも出来ます。

str_atgc の文字列を一文字ずつループで処理し、出現した文字の個数をカウントしています。

処理は冗長ですが、処理速度は模範解答のものより早いかも知れません。

def atgc_countlist(str_atgc):
    a_count = t_count = g_count = c_count = 0
    for c in str_atgc:
        if c == 'A':
            a_count += 1
        elif c == 'T':
            t_count += 1
        elif c == 'G':
            g_count += 1
        elif c == 'C':
            c_count += 1
    return [[a_count, 'A'], [t_count, 'T'], [g_count, 'G'], [c_count, 'C']]

参考

前のCHAPTERはこちら

【教科書解説】Pythonプログラミング入門 (CHAPTER 6 文字列 (string)) 練習問題

「Pythonプログラミング入門」は、東大・京大のプログラミングの授業でも使用されており、無料で読める、東大/京大の「Python教科書」電子書籍で公開されています。 この記事では、CHAPTER 6 ...

続きを見る

この記事は役に立ちましたか?

  • この記事を書いた人
アバター画像

ゴイチ

ソフトウェアエンジニア歴20年。 C/C++, C#, Java, Kotlinが得意で、組込系・スマホ・大規模なWebサービスなど幅広いプログラミング経験があります。 現在は某SNSの会社でWebエンジニアをしています。

-Python
-, ,