2021-02-23

【問題】Python チュートリアル データ構造

python_code_img

Pythonチュートリアルの「データ構造」に関連した問題を掲載します。各問いに対話モードへの記述かスクリプトの記述で解答してください。

問題

Q1.要素を追加する

以下のようにli1を定義してli1を出力してください。li1の末尾に数値11を追加してli1を出力してください。

def gen_list(start, end):
    return list(range(start, end))

li1 = gen_list(1, 11)

Q2.すべての要素を追加する

以下のようにli2 を定義して、li1li2のすべての要素を追加して、li1を出力してください。

li2 = gen_list(12, 21)  

Q3.要素を挿入する

li1の先頭に数値0を挿入してください。挿入後、li1を出力してください。

Q4.要素を削除する

li1から数値4を削除して、li1を出力してください。出力後、再度li1から数値4の削除を試みて、ValueErrorが送出されることを確認してください。

Q5.要素を取り出す

以下のようにli3を定義して、li3から値3を変数valに取り出し、同時にli3から値3を削除してください。この操作のあと、li3valを出力してください。

>>> 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に返してください。その後、li8li9isで比較した結果と、==で比較した結果を出力してください。

Q13.LIFO(last-in, first-out)

空のリストstackを定義して、順番に123stackに格納してください。その後、最後に入れたものから順番に、1つずつ値を2回取り出し、値を出力してください。その後、stackを出力してください。

Q14.FIFO(first-in, first-out)

collections.dequeをつかって、空のqueuequeueを定義してください。その後、順番に順番に123を格納して、最初に格納したものから順番に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からthonをまとめて削除してください。

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}