
Pythonチュートリアルの「データ構造」に関連した問題を掲載します。各問いに対話モードへの記述かスクリプトの記述で解答してください。
問題
Q1.要素を追加する
以下のようにli1
を定義してli1
を出力してください。li1
の末尾に数値11
を追加してli1
を出力してください。
def gen_list(start, end):
return list(range(start, end))
li1 = gen_list(1, 11)
Q2.すべての要素を追加する
以下のようにli2
を定義して、li1
にli2
のすべての要素を追加して、li1
を出力してください。
li2 = gen_list(12, 21)
Q3.要素を挿入する
li1
の先頭に数値0
を挿入してください。挿入後、li1
を出力してください。
Q4.要素を削除する
li1
から数値4
を削除して、li1
を出力してください。出力後、再度li1
から数値4
の削除を試みて、ValueError
が送出されることを確認してください。
Q5.要素を取り出す
以下のようにli3
を定義して、li3
から値3
を変数val
に取り出し、同時にli3
から値3
を削除してください。この操作のあと、li3
とval
を出力してください。
>>> li3 = gen_list(1, 10)
Q6.リストの要素をすべて削除する
li3
からすべての要素を削除して、li3
を出力してください。
Q7.インデックス番号を取得する
li1
から、値7
のインデックスを取得して、出力してください。続いて、Q4でli1
から4
を削除した状態で、値4
のインデックスの取得を試みてErrorが送出されることを確認してください。
Q8.要素のカウント
以下のようにli4
を定義して、値3
の要素数をカウントしてください。カウントした結果を出力してください。
li4 = [1, 2, 3, 3] * 5
Q9.リストのソート
以下のようにli5
を定義して、li5
を降順に並び替えてください。その後、li5
を出力してください。
li5 = [13, 45, 82, 76, 95, 93, 66, 54, 46, 90, 47, 36, 39, 16, 71, 21]
Q10.メソッドで逆順にする
以下のようにli6
を定義して、li6
をリストのメソッドを使って逆順にしてください。その後、li6
を出力してください。
li6 = [95, 93, 90, 82, 76, 71, 66, 54, 47, 46, 45, 39, 36, 21, 16, 13]
Q11.スライスで逆順にする
以下のようにli7
を定義したあと、スライスでli7
を逆順にしたものをli8
に格納してください。格納したあと、li8
を出力してください。
li7 = list("Python3.9 Tutorial")
Q12.メソッドでコピーする
リストのメソッドを使ってli8
を浅いコピーをli9
に返してください。その後、li8
とli9
をis
で比較した結果と、==
で比較した結果を出力してください。
Q13.LIFO(last-in, first-out)
空のリストstack
を定義して、順番に1
、2
、3
をstack
に格納してください。その後、最後に入れたものから順番に、1つずつ値を2回取り出し、値を出力してください。その後、stack
を出力してください。
Q14.FIFO(first-in, first-out)
collections.deque
をつかって、空のqueuequeue
を定義してください。その後、順番に順番に1
、2
、3
を格納して、最初に格納したものから順番に1つずつ値を下位取り出して、値を出力してください。その後、queue
を出力してください。
Q15.円の面積の計算
1cm区切りで、半径が1cm-10cmの円の面積を格納したリストcircle_list
を作成してください。circle_list
の初期値は空リストをつかってください。円周率にはmath.pi
を使用して、round
をつかって面積を小数第3位まで丸めてください。すべての値を格納したら、circle_list
を出力してください。
Q16.リスト内包表記
Q15をリスト内包表記を使ってcircle_list
を作成して、出力してください。
Q17.行列の入れ替え
以下のリストmatrix
の行と列を入れ替えて出力してください。
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Q18.要素をまとめて削除する
以下のリストlang
からt
、h
、o
、n
をまとめて削除してください。
lang = list("Python3.9")
Q19.タプルの定義
空のタプルempty
、値Hi
のみを含むタプルgreeting
、値Python
, 3.9
を含むタプルlang
を定義して、定義したすべてのタプルを出力してください。
Q20.集合の内包表記
内包表記を用いて、1
から30
までの数値で3の倍数のものを格納した集合を作成してください。集合の生成時にif文をつかって、3の倍数であるかをフィルターしてください。
Q21.辞書からキーと値のリストを生成する
以下のようにlang_dict
を定義して、lang_dict
からキーのリスト生成して出力してください。
lang_dict = {"Ruby": 1995, "C#": 2000, "FORTRAN": 1954,
"Java": 1996, "C++": 1983, "Go": 2009,
"JavaScript": 1995, "LISP": 1958, "Rust": 2010,
"Erlang": 1986, "Scala": 2004, "Perl": 1987,
"Python": 1991, "R": 1996, "C": 1972,
"Elixir": 2012, "PHP": 1995, "OCaml": 1996,
"Swift": 2014, "COBOL": 1959}
Q22.辞書から値のリストを生成する
Q21で生成したlang_dict
から、値のリストを生成して出力してください。
Q23.辞書からアイテムを取得する
Q21で生成したlang_dict
を使って、インデックス番号・キー・値(以降、3つの値といいます)を取得するfor文を書き、3つの値を出力してください。
Q24.辞書のソート
Q21で生成したlang_dict
をキーを基準に昇順ソートして、sorted_dict
に格納してください。その後、sorted_dict
を出力してください。
Q25.辞書のフィルター
Q21で生成したlang_dict
を以下の条件でフィルターして、fil_dict
に格納してください。その後、fil_dict
を出力してください。
lang_dict
の値が1991
以上、2000
以下であること- かつ、
lang_dict
のキーについてどちらかの条件に当てはまること- キーに
P
が含まれていること - キーに
a
が含まれていること
- キーに
解答
A1.要素を追加する
>>> li1 = gen_list(1, 11)
>>> print(li1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li1.append(11)
>>> print(li1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
A2.すべての要素を追加する
>>> li1.extend(li2)
>>> print(li1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
A3.要素を挿入する
>>> li1.insert(0, 0)
>>> print(li1)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
A4.要素を削除する
>>> li1.remove(4)
>>> li1
[0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> li1.remove(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
A5.要素を取り出す
>>> li3 = gen_list(1, 10)
>>> v = li3.pop(2)
>>> print(li3, v)
[1, 2, 4, 5, 6, 7, 8, 9] 3
A6.リストの要素をすべて削除する
>>> li3.clear()
>>> print(li3)
[]
A7.インデックス番号を取得する
>>> index_num = li1.index(7)
>>> print(index_num)
6
>>> li1.index(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 4 is not in list
A8.要素のカウント
>>> li4 = [1, 2, 3, 3] * 5
>>> cnt = li4.count(3)
>>> print(cnt)xe
10
A10.リストのソート
>>> li5 = [13, 45, 82, 76, 95, 93, 66, 54, 46, 90, 47, 36, 39, 16, 71, 21]
>>> li5.sort(reverse=True)
>>> print(li5)
[95, 93, 90, 82, 76, 71, 66, 54, 47, 46, 45, 39, 36, 21, 16, 13]
A10.メソッドで逆順にする
>>> li6 = [95, 93, 90, 82, 76, 71, 66, 54, 47, 46, 45, 39, 36, 21, 16, 13]
>>> li6.reverse()
>>> print(li6)
[13, 16, 21, 36, 39, 45, 46, 47, 54, 66, 71, 76, 82, 90, 93, 95]
A11.スライスで逆順にする
>>> li7 = list("Python3.9 Tutorial")
>>> li8 = li7[::-1]
>>> print(li8)
['l', 'a', 'i', 'r', 'o', 't', 'u', 'T', ' ', '9', '.', '3', 'n', 'o', 'h', 't', 'y', 'P']
A12.メソッドでコピーする
>>> li9 = li8.copy()
>>> print(li8 is li9)
False
>>> print(li8 == li9)
True
A13.LIFO(last-in, first-out)
>>> stack.append(1)
>>> stack.append(2)
>>> stack.append(3)
>>> print(stack.pop())
3
>>> print(stack.pop())
2
>>> print(stack)
[1]
A14.FIFO(first-in, first-out)
>>> from collections import deque
>>>
>>> queue = deque([])
>>> queue.append(1)
>>> queue.append(2)
>>> queue.append(3)
>>> print(queue.popleft())
1
>>> print(queue.popleft())
2
>>> print(queue)
deque([3])
A15.円の面積の計算
>>> from math import pi
>>> circle_list = []
>>> for r in range(1, 11):
... circle_list.append(round(r ** 2 * pi, 3))
...
>>> print(circle_list)
[3.142, 12.566, 28.274, 50.265, 78.54, 113.097, 153.938, 201.062, 254.469, 314.159]
A16.リスト内包表記
>>> from math import pi
>>> circle_list = [round(r ** 2 * pi, 3) for r in range(1, 11)]
>>> print(circle_list)
[3.142, 12.566, 28.274, 50.265, 78.54, 113.097, 153.938, 201.062, 254.469, 314.159]
A17.行列の入れ替え
>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> print(list(zip(*matrix)))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
A18.要素をまとめて削除する
>>> lang = list("Python3.9")
>>> del lang[2:6]
>>> print(lang)
['P', 'y', '3', '.', '9']
A19.タプル
>>> empty = ()
>>> greeting = "Hi",
>>> lang = "Python", "3.9" # 3.9はfloatでもOKです
>>> print(empty)
()
>>> print(greeting)
('Hi',)
>>> print(lang)
('Python', '3.9')
A20.集合の内包表記
>>> print({n for n in range(1, 31) if n % 3 == 0})
{3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
A21.辞書からキーのリストを生成する
>>> lang_dict = {"Ruby": 1995, "C#": 2000, "FORTRAN": 1954,
... "Java": 1996, "C++": 1983, "Go": 2009,
... "JavaScript": 1995, "LISP": 1958, "Rust": 2010,
... "Erlang": 1986, "Scala": 2004, "Perl": 1987,
... "Python": 1991, "R": 1996, "C": 1972,
... "Elixir": 2012, "PHP": 1995, "OCaml": 1996,
... "Swift": 2014, "COBOL": 1959}
>>> print(list(lang_dict.keys()))
['Ruby', 'C#', 'FORTRAN', 'Java', 'C++', 'Go', 'JavaScript', 'LISP', 'Rust', 'Erlang', 'Scala', 'Perl', 'Python', 'R', 'C', 'Elixir', 'PHP', 'OCaml', 'Swift', 'COBOL']
A22.辞書から値のリストを生成する
>>> print(list(lang_dict.values()))
[1995, 2000, 1954, 1996, 1983, 2009, 1995, 1958, 2010, 1986, 2004, 1987, 1991, 1996, 1972, 2012, 1995, 1996, 2014, 1959]
A23.辞書からアイテムを取得する
>>> for num, (key, val) in enumerate(lang_dict.items()):
... print(num, key, val)
...
0 Ruby 1995
1 C# 2000
2 FORTRAN 1954
3 Java 1996
4 C++ 1983
5 Go 2009
6 JavaScript 1995
7 LISP 1958
8 Rust 2010
9 Erlang 1986
10 Scala 2004
11 Perl 1987
12 Python 1991
13 R 1996
14 C 1972
15 Elixir 2012
16 PHP 1995
17 OCaml 1996
18 Swift 2014
19 COBOL 1959
A24.辞書のソート
>>> print(sorted_dict)
{'C': 1972, 'C#': 2000, 'C++': 1983, 'COBOL': 1959, 'Elixir': 2012, 'Erlang': 1986, 'FORTRAN': 1954, 'Go': 2009, 'Java': 1996, 'JavaScript': 1995, 'LISP': 1958, 'OCaml': 1996, 'PHP': 1995, 'Perl': 1987, 'Python': 1991, 'R': 1996, 'Ruby': 1995, 'Rust': 2010, 'Scala': 2004, 'Swift': 2014}
A25.辞書のフィルター
>>> # for文
>>> fil_dict = {}
>>> for key, val in lang_dict.items():
... if 2000 >= val >= 1991 and ("P" in key or "a" in key):
... fil_dict[key] = val
...
>>> # 内包表記
>>> fil_dict = {k: v for k, v in lang_dict.items()
... if 2000 >= v >= 1991 and ("P" in k or "a" in k)}
>>> print(fil_dict)
{'Java': 1996, 'JavaScript': 1995, 'Python': 1991, 'PHP': 1995, 'OCaml': 1996}