「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']]
参考
- Pythonプログラミング入門 — Pythonプログラミング入門 documentation (utokyo-ipp.github.io)
- PDF版 Pythonプログラミング入門 (utokyo-ipp.github.io)
- Colaboratory へようこそ - Colaboratory (google.com)
- 無料で読める、東大/京大の「Python教科書」電子書籍:AI・機械学習の無料電子書籍 - @IT (itmedia.co.jp)
- 組み込み型 — Python 3.11.3 ドキュメント
前のCHAPTERはこちら
-
【教科書解説】Pythonプログラミング入門 (CHAPTER 6 文字列 (string)) 練習問題
「Pythonプログラミング入門」は、東大・京大のプログラミングの授業でも使用されており、無料で読める、東大/京大の「Python教科書」電子書籍で公開されています。 この記事では、CHAPTER 6 ...
続きを見る