練習問題:リスト | データ構造#
Jupyter Notebook ファイルの準備
課題用に「practice8-1.ipynb」 という名前で Jupyter Notebook のファイルを作成してください。
この練習問題を通して、 リスト | データ構造 で学習した内容を改めて確認してください。
リストの基本操作#
問題1#
以下の表に示す学生名簿を表すリストを作成し、変数 student_list
に代入してください。なお、各学生のレコードは [出席番号, 名前(姓), 名前(名)]
のリストで表すものとします。
出席番号 |
名前(姓) |
名前(名) |
---|---|---|
1 |
田中 |
太郎 |
2 |
山田 |
花子 |
3 |
佐藤 |
渉 |
4 |
鈴木 |
翔 |
解答例を見る
この学生名簿は以下のような、2次元リストで表すことができます。リテラルを1行にまとめると長くなる場合は、要素間に改行を入れることで分かりやすくなります。
student_list = [[1, "田中", "太郎"],
[2, "山田", "花子"],
[3, "佐藤", "渉"],
[4, "鈴木", "翔"]]
問題2#
以下のリスト letters
から、次の要素をそれぞれブラケット表記法を用いて取得し、print
関数で内容を出力してください。
letters = ["P", "Y", "T", "H", "O", "N"]
先頭の要素
先頭から数えて3番目の要素
末尾の要素
末尾から数えて3番目の要素
解答例を見る
リストの要素は、先頭を 0 として末尾に向かって 1 ずつ増加するインデックスを、ブラケット([]
)内に指定して取得できます。ブラケットに負の値を指定した場合、末尾の要素を -1 とし、先頭に向かって -1 ずつ増える負のインデックスを用いて、逆順で要素を取得できます。
letters = ["P", "Y", "T", "H", "O", "N"]
print(letters[0]) # P: 先頭の要素
print(letters[2]) # T: 先頭から数えて3番目の要素
print(letters[-1]) # N: 末尾の要素
print(letters[-3]) # H: 末尾から数えて3番目の要素
負のインデックスを用いない場合は、リストの長さ(要素数)を取得する len
関数と組み合わせることで、末尾から数えた番号を使って要素を取得できます。
letters = ["P", "Y", "T", "H", "O", "N"]
print(letters[0]) # P: 先頭の要素
print(letters[2]) # T: 先頭から数えて3番目の要素
print(letters[len(letters)-1]) # N: 末尾の要素
print(letters[len(letters)-3]) # H: 末尾から数えて3番目の要素
問題3#
以下の二次元リスト user_table
から、次の要素をそれぞれブラケット表記法を用いて取得し、print
関数で内容を出力してください。
# データベースのテーブルから取得したユーザー情報を想定した二次元スト
user_table = [
['id', 'login_id', 'user_name'], # 0 番目の要素はカラム名を表すリスト
[1, 'user_001', 'Mitarai'], # 各ユーザーのレコードを表すリスト
[2, 'user_002', 'Yano'],
[3, 'user_003', 'Kohara'],
]
id
列の値が1
である要素(ユーザー)のlogin_id
の値id
列の値が3
である要素(ユーザー)のuser_name
の値
解答例を見る
user_table[outer_index]
は1ユーザーのレコードを表す内側のリストを取得します。内側のリストから要素を取得する場合は、user_table[outer_index][inner_index]
と連続したブラケットを記述します。
user_table = [
['id', 'login_id', 'user_name'],
[1, 'user_001', 'Mitarai'],
[2, 'user_002', 'Yano'],
[3, 'user_003', 'Kohara'],
]
print(user_table[1][1]) # user_001
print(user_table[3][2]) # Kohara
問題4#
以下のリスト kyushu
から、for 文を用いて繰り返し要素を取得し、それぞれ print
関数で内容を出力してください。
kyushu = ["Fukuoka", "Kumamoto", "Nagasaki", "Oita", "Saga", "Kagoshima", "Miyazaki", "Okinawa"]
解答例を見る
繰り返し要素を取得したいリスト kyushu
を in
キーワードの後に指定します。これで for
キーワードの後の変数 prefecture
へ順番に要素が代入されます。
kyushu = ["Fukuoka", "Kumamoto", "Nagasaki", "Oita", "Saga", "Kagoshima", "Miyazaki", "Okinawa"]
for prefecture in kyushu:
print(prefecture)
リストのスライス#
問題#
リスト letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
から、次の部分リストを取得して表示するスクリプトを、スライスを使用して作成してください。
['c', 'd', 'e', 'f']
['b', 'd', 'f']
['a', 'd', 'g']
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
['g', 'e', 'c', 'a']
解答例を見る
インデックスが 0
から始まることや、スライスの範囲に 終了値
の要素は含まれないことに気を付けてください。また、ステップに負の値を指定すると、要素を逆順に取得することができます。
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
print(letters[2:6]) # 1. ['c', 'd', 'e', 'f']
print(letters[1:6:2]) # 2. ['b', 'd', 'f']
print(letters[::3]) # 3. ['a', 'd', 'g']
print(letters[::-1]) # 4. ['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
print(letters[-2::-2]) # 5. ['g', 'e', 'c', 'a']
メソッドを利用したリストの操作#
問題1#
次のリスト survey_results
から、次の情報を取得し、print
関数でそれぞれ出力してください。
# 全従業員の通勤に利用する交通手段の調査結果
survey_results = ['bus & train', 'bus', 'train', 'bicycle', 'on foot',
'train', 'bus', 'on foot', 'bus & train', 'bicycle']
【 取得する情報 】
'train'
と等しい値をもつ最初の要素のインデックス'bicycle'
と等しい値をもつ要素の個数通勤で
'bus'
を利用する従業員の人数
解答例を見る
それぞれ次のメソッドを使うことで、リストから情報を取得できます。
index(obj)
:引数obj
と等しい値をもつ最初の要素のインデックスを返すcount(obj)
:引数obj
と等しい値をもつ要素の個数を返す
survey_results = ['bus & train', 'bus', 'train', 'bicycle', 'on foot',
'train', 'bus', 'on foot', 'bus & train', 'bicycle']
print(survey_results.index('train')) # 1. インデックス 2
print(survey_results.count('bicycle')) # 2. 2個
print(survey_results.count('bus')
+ survey_results.count('bus & train')) # 3. 4人
問題2#
次のリスト numbers
に、以下の整数値を、それぞれ指定された位置(インデックス)へ順番に追加してください。また、要素の追加を終えたリスト numbers
を print
関数で出力してください。
numbers = [6, 12, 18, 30, 36, 42, 48]
54
を末尾に追加24
を18
と30
の間に追加
解答例を見る
リストへの要素の追加は次のメソッドで行います。
append(obj)
: 引数obj
をリストの末尾に追加するinsert(index, obj)
: 最初の引数index
の位置にふたつめの引数obj
を追加する
numbers = [6, 12, 18, 30, 36, 42, 48]
numbers.append(54)
numbers.insert(3, 24)
print(numbers) # [6, 12, 18, 24, 30, 36, 42, 48, 54]
問題3#
次のリスト program_languages
から、それぞれ以下の要素を順番に削除してください。また、要素の削除を終えたリスト numbers
を print
関数で出力してください。
program_languages = ['Java', 'Python', 'JavaScript', 'TypeScript',
'Perl', 'Ruby', 'Kotlin', 'Go', 'Rust', 'PHP',
'Swift', 'C', 'C++', 'C#', 'COBOL', 'FORTRAN']
末尾とそのひとつ前の要素
'Perl'
と等しい値をもつ要素
解答例を見る
リストからの要素の削除は次のメソッドで行います。
pop(index)
: 引数index
の位置にある要素を削除して返す (※ 引数を省略した場合は末尾の要素が削除対象)remove(obj)
: 引数obj
と等しい値をもつ最初の要素を削除する
program_languages = ['Java', 'Python', 'JavaScript', 'TypeScript',
'Perl', 'Ruby', 'Kotlin', 'Go', 'Rust', 'PHP',
'Swift', 'C', 'C++', 'C#', 'COBOL', 'FORTRAN']
program_languages.pop() # 2回呼び出すことで末尾から2つの要素を削除できる
program_languages.pop()
program_languages.remove('Perl')
print(program_languages)
問題4#
次のトランプのカードを順番に並べたリスト cards
の要素を逆順に並べ替え、 print
関数で出力してください。
cards = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
解答例を見る
リストの要素を逆順に並べ替えるには reverse
メソッドを使います。
cards = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
cards.reverse()
print(cards)
元のリストを変更せずに、その要素を逆順に並べ替えた新しいリストを取得したい場合は、代わりにリストのスライスを用います。
cards = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
reversed_cards = cards[::-1]
print(cards, reversed_cards)
リストのアンパック#
問題1#
次の3つのリストの要素を odakyu_line
、soutetsu_line
、enoshima_line
、の順に結合した新しいリスト route
を、アンパックを利用して作成し、print
関数で出力してください。ただし、同じ値をもつ要素が重複しないように、スライスを上手く併用してください。
odakyu_line = ['本厚木駅', '厚木駅', '海老名駅']
soutetsu_line = ['海老名駅', 'かしわ台駅', 'さがみ野駅', '大和駅']
enoshima_line = ['大和駅', '鶴間駅', '南林間駅', '中央林間駅']
【 期待する出力 】
['本厚木駅', '厚木駅', '海老名駅', 'かしわ台駅', 'さがみ野駅', '大和駅', '鶴間駅', '南林間駅', '中央林間駅']
解答例を見る
前のリストの末尾の要素と、次のリストの先頭の要素が同じ駅名であるため、これらが重複しないように、以下の例では、次のリストの先頭を省いた部分リストを取得し、それをアンパックして結合しています。
odakyu_line = ['本厚木駅', '厚木駅', '海老名駅']
soutetsu_line = ['海老名駅', 'かしわ台駅', 'さがみ野駅', '大和駅']
enoshima_line = ['大和駅', '鶴間駅', '南林間駅', '中央林間駅']
route = [*odakyu_line, *soutetsu_line[1:], *enoshima_line[1:]]
print(route)
問題2#
リストのアンパックを用いて、次のリスト user_record
の要素を先頭から順番に、変数 id
、login_id
、user_name
へ一括で代入してください。また、各変数に代入された値を print
関数で出力して結果を確かめてください。
user_record = [1, 'user_001', 'Mitarai']
解答例を見る
変数をリストの要素順にカンマ区切りで記述することで、リストのアンパックを用いた分割代入が行えます。
user_record = [1, 'user_001', 'Mitarai']
id, login_id, user_name = user_record
print(id, login_id, user_name)
リストと演算子#
問題1#
以下の2つのリスト cards_2
と cards_2
を比較し、同じ値をもつ要素(共通の要素)が何個あるかを調べ、結果を print
関数で出力してください。
cards_1 = ['2', '5', 'K', 'A', 'J', '8']
cards_2 = ['8', '10', 'J', '3', '6', 'A']
解答例を見る
一方のリストの要素を for 文を用いて順番に取得し、その要素と同じ値をもつ要素がもう一方のリストにあるかどうかを in
演算子で評価することで、共通する要素の数を調べることができます。
cards_1 = ['2', '5', 'K', 'A', 'J', '8']
cards_2 = ['8', '10', 'J', '3', '6', 'A']
count = 0
for card in cards_1:
if card in cards_2:
count += 1
print(count) # 3: '8', 'J', 'A' の 3 つが共通している
問題2#
以下のリスト pitch_names
を用いて指定された要素をもつリスト music
を作成し、print
関数で出力してください。
【 使用するリスト 】
pitch_names = ['ド', 'レ', 'ミ', 'ファ', 'ソ', 'ラ', 'シ']
【 作成するリストの要素 】
['ド', 'レ', 'ミ', 'ファ', 'ミ', 'レ', 'ド', 'ミ', 'ファ', 'ソ', 'ラ', 'ソ', 'ファ', 'ミ']
解答例を見る
リストのスライスと +
演算子による結合を用いて、次のように記述できます。
pitch_names = ['ド', 'レ', 'ミ', 'ファ', 'ソ', 'ラ', 'シ']
music = pitch_names[0:4] + \ # ['ド', 'レ', 'ミ', 'ファ']
pitch_names[-5::-1] + \ # ['ミ', 'レ', 'ド']
pitch_names[2:6] + \ # ['ミ', 'ファ', 'ソ', 'ラ']
pitch_names[-3:-6:-1] # ['ソ', 'ファ', 'ミ']
print(music)
リストの内包表記#
問題1#
1 から 6 の数字を要素にもつリスト nums
から、各要素を 2 倍にした値を要素とするリスト nums_double
を、リストの内包表記を使用して作成してください。
nums = [1, 2, 3, 4, 5, 6]
nums_double = # ここに内包表記を使用した式を記述
print(nums_double) # [2, 4, 6, 8, 10, 12]
解答例を見る
nums = [1, 2, 3, 4, 5, 6]
nums_double = [ n * 2 for n in nums]
print(nums_double)
問題2#
以下のリスト numbers
から、1.0 以上かつ 2.0 未満の要素を取り出したリスト result
を作成し、表示するスクリプトを作成してください。
numbers = [2.1, 0.2, 0.3, 1.4, 3.1, 0.3, 1.6]
# ここに result を作成するコードを追加
print(result) # [1.4, 1.6]
解答例を見る
リストの内包表記内で if
キーワードを使うと、条件式が成り立つ要素のみを抽出できます。
numbers = [2.1, 0.2, 0.3, 1.4, 3.1, 0.3, 1.6]
result = [n for n in numbers if n >= 1.0 and n < 2.0]
print(result)