An Embedded Engineer’s Blog

とある組み込みエンジニアの備忘録的なブログです。

Python学習メモ - その8

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回はディクショナリ(Dictionary)についてです。


ディクショナリ(Dictionary)

ディクショナリはユニーク(一意)なキーとそれに対応する値を格納するコレクションです。
例えば、IDとそれに対応する顧客名など、重複する可能性のある値(顧客名)を別の重複しないキー(ID)で管理したい場合などに使用します。


ディクショナリ(単一型)

ディクショナリはキーと値のセット(要素)をコロン(:)で表し、複数の要素をカンマ( , )で区切り、前後に中かっこ「{ }」をつけることでディクショナリとして認識されます。

dict_values = {"A": 1, "B": 2, "C": 3, "D": 4}
print(dict_values)

実行結果

{'A': 1, 'B': 2, 'C': 3, 'D': 4}


ディクショナリ(複数型)

一意の値であれば、異なる型のデータをキーに使用することができます。
また、キーに対する値にも異なる型を格納することができます。

dict_values = {"A": 1, "B": 3.14, 3.5: (1 + 2j), "4": 4}
print(dict_values)

実行結果

{'A': 1, 'B': 3.14, 3.5: (1+2j), '4': 4}


重複定義

ディクショナリの定義時に、重複したキーで初期化した場合、最後にセットされたキーの値が有効となります(最後の値で上書きされる)。

dict_values = {"A": 1, "B": 2, "C": 3, "D": 4, "A": 5}
print(dict_values)

実行結果

{'A': 5, 'B': 2, 'C': 3, 'D': 4}


値の取得(エラーあり)

ディクショナリに対して、キーを指定することで値を取得することができます。
この方法では、存在しないキーを指定すると実行エラーとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
print(dict_values)
print(dict_values["A"])
print(dict_values["B"])
print(dict_values["C"])
# print(dict_values["D"])  # 実行エラー

実行結果

{'A': 1, 'B': 2, 'C': 3}
1
2
3


値の取得(エラーなし or デフォルト値)

getメソッドを使用することでも、キーを指定した値の取得が可能です。
この場合、存在しないキーを指定するとNoneが返されます。
また、存在しないキーを指定した場合に返されるデフォルト値を指定することもできます。

dict_values = {"A": 1, "B": 2, "C": 3}
print(dict_values)
print(dict_values.get("A"))
print(dict_values.get("B"))
print(dict_values.get("C"))
print(dict_values.get("D"))
print(dict_values.get("D", "Unknown Key"))

実行結果

{'A': 1, 'B': 2, 'C': 3}
1
2
3
None
Unknown Key


値の変更

キーを指定して、値を格納することで、値を変更することができます。

dict_values = {"A": 1, "B": 2, "C": 3}
print(dict_values)
dict_values["B"] = 4
print(dict_values)

実行結果

{'A': 1, 'B': 2, 'C': 3}
{'A': 1, 'B': 4, 'C': 3}


空ディクショナリ

空(要素数0)のディクショナリを作成したい場合には、「{}」のみを記述します。

dict_values = {}
print(dict_values)

実行結果

{}


追加

存在しないキーを指定して、値を格納することで要素を追加することができます。

dict_values = {}
dict_values["A"] = 1
dict_values["B"] = 2
dict_values["C"] = 3

print(dict_values)

実行結果

{'A': 1, 'B': 2, 'C': 3}


値の削除

キーを指定してdel演算子を使用することで指定したキーの要素を削除することができます。

dict_values = {"A": 1, "B": 2, "C": 3}

del dict_values["B"]

print(dict_values)

実行結果

{'A': 1, 'C': 3}


値の取り出し(キー指定)

popメソッドを使用することで、指定したキーに対応する値を取り出し(取得 & 削除)することができます。
また、存在しないキーを指定した場合に返されるデフォルト値を指定することもできます。
デフォルト値を指定しないで存在しないキーを指定した場合は、実行エラーとなります。

dict_values = {"A": 1, "B": 2, "C": 3}

pop_value = dict_values.pop("B")
print(pop_value)

pop_value = dict_values.pop("D", "Not Found")
print(pop_value)

# pop_value = dict_values.pop("D")  # 実行エラー

print(dict_values)

実行結果

2
Not Found
{'A': 1, 'C': 3}


キー&値の取り出し

popitemメソッドを使用することで、最後に追加された要素から順番に要素(キー&値)を取り出し(取得&削除)することができます。
空のディクショナリに対してpopitemメソッドを使用すると実行エラーとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
pop_value = dict_values.popitem()
print(pop_value)
pop_value = dict_values.popitem()
print(pop_value)
pop_value = dict_values.popitem()
print(pop_value)
# pop_value = dict_values.popitem() # 実行エラー

実行結果

('C', 3)
('B', 2)
('A', 1)


クリア

ディクショナリをクリアする場合には、clearメソッドを使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
dict_values.clear()
print(dict_values)

実行結果

{}


デフォルト指定セット

setdefaultメソッドを指定すると、以下のような処理を行うことができます。
1. すでに存在するキーを指定した場合は、そのキーに対応する値を返す 2. 存在しないキーとデフォルト値を指定した場合は、そのキーとデフォルト値で要素を追加する 3. 存在しないキーのみを指定した場合は、そのキーとNoneで要素を追加する

dict_values = {"A": 1, "B": 2, "C": 3}
set_value = dict_values.setdefault("A", 4)
print(set_value)
set_value = dict_values.setdefault("D", 4)
print(set_value)
set_value = dict_values.setdefault("E")
print(set_value)
print(dict_values)

実行結果

1
4
None
{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': None}


更新

updateメソッドを使用することで、ディクショナリを更新することができます。
複数の要素を一気に変更したい場合に便利です。

dict_values = {"A": 1, "B": 2, "C": 3}
dict_values.update([("B", 4), ("D", 4)])
dict_values.update(D=5, E=6)
print(dict_values)

実行結果

{'A': 1, 'B': 4, 'C': 3, 'D': 5, 'E': 6}


全要素数取得

ディクショナリ全体の要素数を取得したい場合はlen関数を使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
print(len(dict_values))

実行結果

3


コピー

ディクショナリの複製を作成したい場合は、copyメソッドを使用します。

src_dict_values = {"A": 1, "B": 2, "C": 3}
dst_dict_values1 = src_dict_values
dst_dict_values2 = src_dict_values.copy()

print(src_dict_values)
print(dst_dict_values1)
print(dst_dict_values2)

print()

src_dict_values["B"] = 4
dst_dict_values2["D"] = 4

print(src_dict_values)
print(dst_dict_values1)
print(dst_dict_values2)

実行結果

{'A': 1, 'B': 2, 'C': 3}
{'A': 1, 'B': 2, 'C': 3}
{'A': 1, 'B': 2, 'C': 3}

{'A': 1, 'B': 4, 'C': 3}
{'A': 1, 'B': 4, 'C': 3}
{'A': 1, 'B': 2, 'C': 3, 'D': 4}


キーの存在確認

ディクショナリ内に特定のキーを持つ要素が存在しているかを確認する場合には、in演算子を使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
print("B" in dict_values)

実行結果

True


逆に、ディクショナリの中に特定のキーを持つ要素が含まれていないことを確認したい場合は、not in 演算子を使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
print("D" not in dict_values)

実行結果

True


キー一覧(View Object)の取得

ディクショナリに格納されている要素のキー一覧を取得したい場合は、keysメソッドを使用します。
keysメソッドから返されるオブジェクトはView Objectとなります。
View Objectは動的なビューを提供し、ディクショナリの要素が変更された場合にその変更内容が自動的に反映されます。

dict_values = {"A": 1, "B": 2, "C": 3}
keys = dict_values.keys()
print(keys)
dict_values["D"] = 4
print(keys)
print(list(keys))

実行結果

dict_keys(['A', 'B', 'C'])
dict_keys(['A', 'B', 'C', 'D'])
['A', 'B', 'C', 'D']


値一覧(View Object)の取得

ディクショナリに格納されている要素の値一覧を取得したい場合は、valuesメソッドを使用します。
valuesメソッドから返されるオブジェクトもkeysメソッドと同様View Objectとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
values = dict_values.values()
print(values)
dict_values["D"] = 4
print(values)
print(list(values))

実行結果

dict_values([1, 2, 3])
dict_values([1, 2, 3, 4])
[1, 2, 3, 4]


要素一覧(View Object)の取得

ディクショナリに格納されている要素一覧を取得したい場合は、itemsメソッドを使用します。
itemsメソッドから返されるオブジェクトもkeysメソッドやvaluesメソッドと同様View Objectとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
items = dict_values.items()
print(items)
dict_values["D"] = 4
print(items)
print(list(items))

実行結果

dict_items([('A', 1), ('B', 2), ('C', 3)])
dict_items([('A', 1), ('B', 2), ('C', 3), ('D', 4)])
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

Python学習メモ - その7

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回はセット(Set)についてです。


セット(Set)

セットはタプルやリストと同様、複数のデータをまとめて扱う場合に使用しますが、ユニーク(一意)な値を格納する順序なしのコレクションです。
例えば、複数のデータから重複したデータを除去したい場合や、数学集合に関する計算を行う場合に使用します。


セット定義 & アクセス

セットは複数のデータをカンマ( , )で区切り、前後に中かっこ「{ }」をつけることでセットとして認識されます。
セットには順序が記憶されないため、タプルやリストのようなインデックスによるアクセス(値取得・変更)はできません。

set_values = {1, 2, 3, 4}
print(set_values)

set_values = {1, 2, 3, 2, 4, 1}
print(set_values)

# print(set_values[0])  # 実行エラー
# set_values[2] = 10    # 実行エラー

実行結果

{1, 2, 3, 4}
{1, 2, 3, 4}


複数型

一意の値であれば、異なる型のデータを格納することもできます。

set_values = {1, 3.14, "set"}
print(set_values)

set_values = {1, 3.14, 1, "set", 3.14}
print(set_values)

実行結果

{1, 3.14, 'set'}
{1, 3.14, 'set'}


空セット

空のセットを定義する場合は、set()関数を使用します。

set_values = set()

print(set_values)

実行結果

set()


値の追加

値の追加はaddメソッドを使用します。

set_values = set()
set_values.add(1)
set_values.add(2)
set_values.add(3)
set_values.add(2)
set_values.add(4)
set_values.add(1)

print(set_values)

実行結果

{1, 2, 3, 4}


値の削除

値の削除はremoveメソッドまたはdiscardメソッドを使用します。
removeメソッドは値が見つからなかった場合に、エラーが発生します。
discardメソッドは値が見つからなかった場合でもエラーが発生しません。

set_values = {1, 2, 3, 4, 5}

set_values.remove(3)
# set_values.remove(6) # Key Error

実行結果

{1, 2, 4, 5}


set_values = {1, 2, 3, 4, 5}

set_values.discard(3)
set_values.discard(6)

print(set_values)

実行結果

{1, 2, 4, 5}


値の取り出し

セットから順番に値を取得する場合は、popメソッドを使用します。 セットがからの場合、エラーが発生します。

set_values = {1, 2, 3, 4, 5}
print(set_values.pop())
print(set_values.pop())
print(set_values.pop())
print(set_values.pop())
print(set_values.pop())
# print(set_values.pop())  # Error

実行結果

1
2
3
4
5


クリア

セットをクリアする場合には、clearメソッドを使用します。

set_values = {1, 2, 3, 4, 5}
print(set_values)

set_values.clear()
print(set_values)

実行結果

{1, 2, 3, 4, 5}
set()


全要素数取得

セット全体の要素数を取得したい場合はlen関数を使用します。

set_values = {1, 2, 3, 4, 5}

print(len(set_values))

実行結果

5


存在確認

セット内に特定の要素が存在しているかを確認する場合には、in演算子を使用します。

set_values = {1, 2, 3, 4, 5}

print(2 in set_values)

実行結果

True


逆に、セットの中に特定の値が含まれていないことを確認したい場合は、not in 演算子を使用します。

set_values = {1, 2, 3, 4, 5}

print(6 in set_values)

実行結果

True


コピー

セットの複製を作成したい場合は、copyメソッドを使用します。

set_values1 = {1, 2, 3, 4, 5}
set_values2 = set_values1
set_values3 = set_values1.copy()

print(set_values1)
print(set_values2)
print(set_values3)

print()

set_values1.add(6)
set_values2.add(7)
print(set_values1)
print(set_values2)
print(set_values3)

実行結果

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}

{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5}


互いに素

2つのセットが互いに素である(set1とset2が共通の要素を持たない)ことを確認する場合は、isdisjointメソッドを使用します。

set1 = {1, 3, 5, 7}
set2 = {2, 4, 6, 8}

print(set1.isdisjoint(set2))

実行結果

True


部分集合

2つのセットが部分集合の関係である(set1のすべての要素がset2に含まれる(set1とset2が同じでも良い))ことを確認する場合は、issubsetメソッドまたは <= 演算子を使用します。

set1 = {1, 3, 5}

set2 = {1, 2, 3, 4, 5}
print(set1.issubset(set2))
print(set1 <= set2)

print()

set2 = {1, 3, 5}
print(set1.issubset(set2))
print(set1 <= set2)

実行結果

True
True

True
True


真部分集合

2つのセットが真部分集合の関係である(set1のすべての要素がset2に含まれる かつ set1とset2は同じではない)ことを確認する場合は、< 演算子を使用します。 これは、set1.issubset(set2) and set1 != set2と等価です。

set1 = {1, 3, 5}

set2 = {1, 2, 3, 4, 5}
print(set1.issubset(set2) and set1 != set2)
print(set1 < set2)

print()

set2 = {1, 3, 5}
print(set1.issubset(set2) and set1 != set2)
print(set1 < set2)

実行結果

True
True

False
False


上位集合

2つのセットが上位集合の関係である(set2のすべての集合がset1に含まれる(set1とset2が同じでも良い))ことを確認する場合は、issupersetメソッドまたは >= 演算子を使用します。

set1 = {1, 2, 3, 4, 5}

set2 = {1, 3, 5}
print(set1.issuperset(set2))
print(set1 >= set2)

print()

set2 = {1, 2, 3, 4, 5}
print(set1.issuperset(set2))
print(set1 >= set2)

実行結果

True
True

True
True


真上位集合

2つのセットが真上位集合の関係である(set2のすべての要素がset1に含まれる かつ set1とset2は同じではない)ことを確認する場合は、> 演算子を使用します。 これは、set1.issuperset(set2) and set1 != set2と等価です。

set1 = {1, 2, 3, 4, 5}

set2 = {1, 3, 5}
print(set1.issuperset(set2) and set1 != set2)
print(set1 > set2)

print()

set2 = {1, 2, 3, 4, 5}
print(set1.issuperset(set2) and set1 != set2)
print(set1 > set2)

実行結果

True
True

False
False


和集合の作成

set1とset2の要素からなる新しい集合(和集合)を作成する場合、unionメソッドまたは | 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.union(set2)
set4 = set1 | set2

print(set3)
print(set4)

実行結果

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}


積集合の作成

set1とset2の共通要素を持つ新しい集合(積集合)を作成する場合、intersectionメソッドまたは & 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.intersection(set2)
set4 = set1 & set2

print(set3)
print(set4)

実行結果

{1, 3}
{1, 3}


差集合の作成

set1に含まれset2に含まれない要素をもつ新しい集合(差集合)を作成する場合、differenceメソッドまたは - 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.difference(set2)
set4 = set1 - set2

print(set3)
print(set4)

実行結果

{2, 4}
{2, 4}


排他集合の作成

set1とset2のいずれか一方にだけ含まれる要素をもつ新しい集合(排他集合)を作成する場合、symmetric_differenceメソッドまたは ^ 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.symmetric_difference(set2)
set4 = set1 ^ set2

print(set3)
print(set4)

実行結果

{2, 4, 5}
{2, 4, 5}


和更新

set1にset2の要素を追加し、set1を更新(和更新)する場合には、updateメソッドまたは |= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 |= set2

print(set1)

実行結果

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}


積更新

set1とset2に共通する要素を残し、set1を更新(積更新)する場合には、intersection_updateメソッドまたは、 &= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.intersection_update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 &= set2

print(set1)

実行結果

{1, 3}
{1, 3}


差更新

set1からset2に含まれる要素を取り除き、set1を更新(差更新)する場合には、difference_updateメソッドまたは -= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.difference_update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 -= set2

print(set1)

実行結果

{2, 4}
{2, 4}


排他更新

set1とset2のどちらかのみに含まれる要素によって、set1を更新(排他更新)する場合には、symmetric_difference_updateメソッドまたは ^= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.symmetric_difference_update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 ^= set2

print(set1)

実行結果

{2, 4, 5}
{2, 4, 5}


frozenset

frozensetは追加・削除・更新などの操作が不可能(イミュータブル)なセットです。

関数の戻り値として使用する場合など、要素を変更されたくない場合などにfrozensetを使用します。

fset1 = frozenset()
print(fset1)

fset2 = frozenset({1, 2, 3, 4, 5, 3, 2, 4})
print(fset2)

# fset2.add(1) # 実行エラー

実行結果

frozenset()
frozenset({1, 2, 3, 4, 5})


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

Python学習メモ - その6

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回はリスト(List)についてです。


リスト(List)

リストは前回説明したタプルと同様、複数のデータをまとめて扱う場合に使用しますが、タプルとの違いは要素の追加や挿入、削除などが可能なことです。
また、タプルの各要素は変更不可(イミュータブル)ですが、リストの要素は値を編集することができます(ミュータブル)。
そのため、名前の通りTODOリストや顧客リストといった大量かつ編集可能な情報を取り扱う場合によく使用されます。


リスト定義 & アクセス

リストもタプルと同様複数のデータをカンマ( , )で区切りますが、前後に大かっこ「[ ]」をつけることでリストとして認識されます。
リストは、タプルと同様データの各要素へのアクセスは"[i]"で行います。
インデックス i は 0 〜 n-1 (n : 要素数)となります。
※ リストの要素へのアクセスは0ベースインデックスとなります

list_values = [1, 2, 3]

print(list_values)
print(list_values[0])
print(list_values[1])
print(list_values[2])

実行結果

[1, 2, 3]
1
2
3


複数型

タプルと同様、異なる型のデータを混在させることができます。

list_values = [1, 3.14, "list"]

print(list_values)

実行結果

[1, 3.14, 'list']


値の変更

リストでは、指定したインデックスの要素を変更することができます。

list_values = [1, 2, 3]

print(list_values)

list_values[1] = 4

print(list_values)

実行結果

[1, 2, 3]
[1, 4, 3]


空リスト

空(要素数0)のリストを作成したい場合には、「[]」のみを記述します。

list_values = []

print(list_values)

実行結果

[]


要素の追加

appendメソッドを使用することで要素の追加が可能です。

list_values = []
list_values.append(1)
list_values.append(3.14)
list_values.append("list")

print(list_values)

実行結果

[1, 3.14, 'list']


要素の挿入

insertメソッドを使用することで、指定したインデックス位置に要素を挿入することができます。

list_values = []
list_values.append(1)
list_values.append(3.14)
list_values.append("list")

list_values.insert(2, 2 + 3j)

print(list_values)

実行結果

[1, 3.14, (2+3j), 'list']


要素の削除(値検索)

指定した値を検索して要素を削除するには、removeメソッドを使用します。
※ 同じ値の要素が複数存在する場合は、先頭から探して最初に見つかった要素のみが削除されます

list_values = [1, 2, 3, 1, 2, 3]

list_values.remove(3)

print(list_values)

実行結果

[1, 2, 1, 2, 3]


要素の削除(インデックス指定)

指定したインデックスの要素を削除するには、del演算子を使用します。

list_values = [1, 2, 3, 1, 2, 3]

del list_values[1]

print(list_values)

実行結果

[1, 3, 1, 2, 3]


要素の取り出し

popメソッドを使用することで、指定したインデックスの要素を取り出し(取得 & 削除)することができます。

list_values = [1, 2, 3, 1, 2, 3]

pop_value = list_values.pop(2)

print(pop_value)
print(list_values)

実行結果

3
[1, 2, 1, 2, 3]


リストのクリア

リストのすべての要素をクリアするには、clearメソッドを使用します。

list_values = [1, 2, 3, 1, 2, 3]

list_values.clear()

print(list_values)

実行結果

[]


インデックス検索

指定した値を持つ要素のインデックス番号を取得したい場合は、indexメソッドを使用します。
※ 同じ値の要素が複数存在する場合は、先頭から探して最初に見つかった要素のインデックスが返されます

list_values = [1, 2, 3, 1, 2, 3]

index = list_values.index(3)

print(index)

実行結果

2


指定要素数取得

指定した値を持つ要素の数を取得したい場合は、countメソッドを使用します。

list_values = [1, 2, 3, 1, 2, 3]

count = list_values.count(3)

print(count)

実行結果

2


全要素数取得

リスト全体の要素数を取得したい場合はlen関数を使用します。

list_values = [1, 2, 3, 1, 2, 3]

count = len(list_values)

print(count)

実行結果

6


ソート(リスト自体)

リストの要素をソート(並び替え)したい場合はsortメソッドを使用します。

list_values = [2, 5, 1, 3, 4]

list_values.sort()

print(list_values)

実行結果

[1, 2, 3, 4, 5]


ソート(ソートされた新しいリスト)

あるリストに対してソートされた新しいリストを生成したい場合はsorted関数を使用します。

list_values = [2, 5, 1, 3, 4]

soreted_list = sorted(list_values)

print(soreted_list)

実行結果

[1, 2, 3, 4, 5]


コピー

リストの複製を作成したい場合は、copyメソッドを使用します。
Pythonではミュータブルなオブジェクトの代入は参照をコピーします。
例えば、下記のsrc_list_valuesをdst_list_values1に代入していますが、これらは内部的には同じオブジェクトを指しています。
そのため、代入先のdst_list_valuesの値を書き換えたり要素を追加しても、その変更がsrc_list_valuesにも反映されてしまいます。


そういった問題を回避するために、copyメソッドでは、すべての要素を複製した新しいオブジェクトを作成して返します。
これにより、src_list_valuesとは別物のオブジェクトとなるため、値を書き換えたり要素を追加しても、その変更がsrc_list_valuesに反映されなくなります。


なお、copyメソッドは浅いコピー(shallow copy)といって、階層化されたデータのコピーには対応していません。
長くなるのでその辺の話は別の機会にしようと思います。

src_list_values = [1, 2, 3, 4, 5]
dst_list_values1 = src_list_values
dst_list_values2 = src_list_values.copy()

print(src_list_values)
print(dst_list_values1)
print(dst_list_values2)

print()

src_list_values[2] = 10
dst_list_values1[4] = 20
print(src_list_values)
print(dst_list_values1)
print(dst_list_values2)

実行結果

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

[1, 2, 10, 4, 20]
[1, 2, 10, 4, 20]
[1, 2, 3, 4, 5]


拡張

extendメソッドを使用することで、あるリストに新しいリストを追加(拡張)することができます。

list_values1 = [1, 2, 3]
list_values2 = [4, 5, 6]

list_values1.extend(list_values2)

print(list_values1)

実行結果

[1, 2, 3, 4, 5, 6]


結合

2つ以上のリストを結合した新しいリストを作成したい場合は + 演算子を使用することができます。

list_values1 = [1, 2, 3]
list_values2 = [4, 5, 6]

list_values3 = list_values1 + list_values2

print(list_values3)

実行結果

[1, 2, 3, 4, 5, 6]


存在確認

リストの中に特定の値が含まれているかを確認したい場合は、in演算子を使用します。

list_values = [1, 2, 3]

print(2 in list_values)

実行結果

True


逆に、リストの中に特定の値が含まれていないことを確認したい場合は、not in 演算子を使用します。

list_values = [1, 2, 3]

print(4 not in list_values)

実行結果

True


最大・最小値

リスト内の最大・最小値を求めたい場合は、max関数、min関数を使用します。

list_values = [1, 2, 3]

print(max(list_values))
print(min(list_values))

実行結果

3
1


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

Python学習メモ - その5

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回はタプル(Tuple)についてです。


タプル(Tuple)

プログラミングをしていると、複数のデータをまとめて扱いたいときがあります。
例えば、座標などがそうです。
座標は、x軸とy軸(3次元の場合にはz軸)が合わさって意味のあるのデータになります。
タプルを使うことでそういった複数のデータを扱いやすくなります。

x = 1
y = 2
z = 3

tuple_value = (x, y, z)

print(tuple_value)

実行結果

(1, 2, 3)


タプルは、一度宣言すると値の追加や変更・削除ができません。
こういったデータのことをイミュータブル(不変)であると言います。
そのため、タプルは入力データや計算途中で使われる一時的なデータなど、勝手に改変されたくないデータに使用されることが多いです。


タプル定義 & アクセス

タプルは複数のデータをカンマ( , )で区切ることで定義することができます。
前後のカッコ「( )」はつけなくても良いのですが、わかりやすくするためにつけられることが多いです。
タプルで定義したデータの各要素へのアクセスは"[i]"で行います。
インデックス i は 0 〜 n-1 (n : 要素数)となります。
※ タプルの要素へのアクセスは0ベースインデックスとなります

tuple_values = (1, 2, 3)

print(tuple_values)
print(tuple_values[0])
print(tuple_values[1])
print(tuple_values[2])

実行結果

(1, 2, 3)
1
2
3


複数型

タプルには複数のデータ型の値を混在させることができます。

tuple_values = (1, 3.14, "tuple")

print(tuple_values)
print(tuple_values[0])
print(tuple_values[1])
print(tuple_values[2])

実行結果

(1, 3.14, 'tuple')
1
3.14
tuple


インデックス検索

タプルの各要素から、特定の値が含まれているインデックス番号を取得するには、index()メソッドを使用します。
ただし、同じ値が複数含まれている場合、最初に見つかったインデックス番号が返されます。

tuple_values = (1, 2, 3, 1, 2, 3)

index = tuple_values.index(3)

print(index)

実行結果

2


指定要素数取得

タプルに指定した値の要素がいくつ含まれているかを数えるには、count()メソッドを使用します。

tuple_values = (1, 2, 3, 1, 2, 3)

count = tuple_values.count(3)

print(count)

実行結果

2


全要素数取得

タプルに含まれているすべての要素数を数えたい場合には、len()関数を使用します。

tuple_values = (1, 2, 3, 1, 2, 3)

count = len(tuple_values)

print(count)

実行結果

6


タプル展開

タプルは、1つの変数として定義することもできますが、複数の変数に展開する事もできます。

(x, y) = (1, 2)

print(x, y)

tuple_values = (1, 2)

(x, y) = tuple_values

print(x, y)

実行結果

1 2
1 2


連結

複数のタプルを"+"演算子によって連結することができます。
2つ以上のタプルを"+"演算子で接続すると、連結された新しいタプルが返されます。

tuple1 = (1, 2)
tuple2 = (3, 4)
tuple3 = tuple1 + tuple2
print(tuple3)

実行結果

(1, 2, 3, 4)


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

Python学習メモ - その4

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回はビット演算、比較演算、論理演算についてです。


ビット演算

ビット演算はC言語などとほぼ変わらないので、特別異なる点のみ説明します。


シフト演算
print(2 << 3)
print(4 >> 2)

実行結果

16
1


2進数で表示してみると、どう動いてるのかがよく分かると思います。

print(bin(2) + " << " + str(3) + " = " + bin(2 << 3))
print(bin(4) + " >> " + str(2) + " = " + bin(4 >> 2))

実行結果

0b10 << 3 = 0b10000
0b100 >> 2 = 0b1


ビット単位の AND
print(1 & 1)
print(1 & 0)
print(0 & 1)
print(0 & 0)

実行結果

1
0
0
0


ビット単位の OR
print(1 | 1)
print(1 | 0)
print(0 | 1)
print(0 | 0)

実行結果

1
1
1
0


ビット単位の XOR
print(1 ^ 1)
print(1 ^ 0)
print(0 ^ 1)
print(0 ^ 0)

実行結果

0
1
1
0


ビット反転

Pythonには整数のビット数制限がないので、C言語などと同じ感覚で使用すると問題が起こることがあるかもしれません。 Pythonでのビット反転は必ず-(x+1)となります。

print(~1)

実行結果

-2


比較演算

比較演算もC言語などと変わらないので、詳細は省略します。 なお、Pythonでは比較演算の結果はbool型(True / False)で返ります。

算術等価
print(1 == 1)
print(1 == 2)

実行結果

True
False


算術非等価
print(1 != 1)
print(1 != 2)

実行結果

False
True


小なり
print(1 < 1)
print(1 < 2)

print()

print(1 <= 1)
print(1 <= 2)

実行結果

False
True

True
True


大なり
print(1 > 1)
print(1 > 2)

print()

print(1 >= 1)
print(1 >= 2)

実行結果

False
False

True
False


論理演算

論理演算はC言語などと比べて機能的には変わりませんが、表記が異なります。

機能 Python C系言語 備考
論理否定 not !
論理等価 is ==
論理積 and &&
論理和 or ||


論理否定
print(not True)
print(not False)

実行結果

False
True


論理等価
print(True is True)
print(True is False)

実行結果

True
False


論理積
print(True and True)
print(True and False)
print(False and True)
print(False and False)

実行結果

True
False
False
False


論理和
print(True or True)
print(True or False)
print(False or True)
print(False or False)

実行結果

True
True
True
False


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

Python学習メモ - その3

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回は基数についてです。

基数

基数は、各桁を構成する数値や記号の数を表し、簡単に言うと桁が繰り上がる数です。
この基数を使った数の表現方法を記数法と言います。


例えば、普段生活で使用するお金や数字の計算は 10 進数で、基数は 10(0〜9)がとなります。
また、時間の "分"は 60 進数で基数は 60(0〜59)ですし、"時"は 24 進数で基数は 24(0〜23)となります。

コンピュータの世界では、2 進数や 16 進数で数を表すと便利なことが多くあります。
また、最近ではあまり使われませんが 8 進数もあります。

2 進数、8 進数、16 進数

Python では、普通に整数値を記述した場合は 10 進数としてみなされます。
2 進数や 16 進数で表したい場合には、接頭語(プレフィックス)をつけます。

基数 接頭語 構成数値/記号 備考
10 進数 なし 0〜9
2 進数 0b 0〜1
8 進数 0o 0〜7
16 進数 0x 0〜9、A〜F


dec_num = 10
bin_num = 0b1010
oct_num = 0o12
hex_num = 0x0A

print(dec_num)
print(bin_num)
print(oct_num)
print(hex_num)

実行結果

10
10
10
10


2 進数や 16 進数で表現したとしても、内部的にはすべて整数型(int)で認識されます。
そのため、異なる基数で定義した数値同士の演算もそのまま行うことができます。

print(dec_num + bin_num + oct_num + hex_num)

実行結果

40


桁区切り

Python では、長い桁の数値を表す時に、見やすいように桁を区切る事ができます。
桁区切りは、区切りたい場所にアンダースコア"_"を挿入します。


2 進数は 4 桁ごと、16 進数は 2 桁ごと、10 進数は 3 桁ごとで区切られるのが一般的です。

bin_num1 = 0b10101010
bin_num2 = 0b1010_1010

hex_num1 = 0x1010
hex_num2 = 0x10_10

dec_num1 = 100000
dec_num2 = 100_000

print(bin_num1)
print(bin_num2)

print()

print(hex_num1)
print(hex_num2)

print()

print(dec_num1)
print(dec_num2)

実行結果

170
170

4112
4112

100000
100000


文字列変換

整数値を 2 進数、8 進数、16 進数の文字列に変換したい場合には、bin()、oct()、hex()関数を使用します。
文字列に変換した場合、プレフィックスは自動的に付加されます。

dec_num = 10

print(bin(dec_num))
print(oct(dec_num))
print(hex(dec_num))

実行結果

0b1010
0o12
0xa


数値変換

逆に、2 進数、8 進数、16 進数で表現された文字列を整数に変換する場合は、int()関数を使用します。

10 進数以外の文字列を数値に変換する場合には、第 2 引数に基数を指定する必要があります(第 2 引数を省略した場合は、10 進数値とみなして変換処理を行います)。

bin_str = "1010"
oct_str = "12"
hex_str = "0A"

print(int(bin_str, 2))
print(int(oct_str, 8))
print(int(hex_str, 16))

実行結果

10
10
10


ただし、変換したい文字列にプレフィックスがついていることが確実である場合、第 2 引数に 0 を指定することで、プレフィックスに応じた基数で整数への変換が行われます。

bin_str = "0b1010"
oct_str = "0o12"
hex_str = "0x0A"

print(int(bin_str, 0))
print(int(oct_str, 0))
print(int(hex_str, 0))

実行結果

10
10
10


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

Python学習メモ - その2

まえがき

最近、Pythonを勉強し始めたので、その学習メモです。

今回は数値演算、数学関数についてです。


数値演算

まずは、数値演算です。
Pythonでは、標準で整数、浮動小数点数複素数を取り扱うことができます。


整数や浮動小数点は、C / C++ / C#などと違いビット数によって型を使い分ける必要がありません。
ちなみに、Python 3における整数と浮動小数点の精度は次のようになっているそうです。

種別 型名 ビット数 詳細 備考
整数 int なし 最大/最小の上限なし メモリが許す限り大きな値を取扱可能
浮動小数点数 float 64bit Cのdouble相当の精度


また、C / C++ / C#では標準で用意されていない複素数が使えることも特徴です。


整数(Integer Number)

Pythonでは、小数点をつけない数値を記述することで、整数として認識されます。
整数は、標準演算子で加算( + )、減算( - )、乗算( * )、除算( / or // )、剰余算( % )、累乗算( ** )を行うことができます。

除算は小数点以下も結果に含める"/"と、小数点以下を切り捨てる"//"を使い分けることができます。

int_num1 = 100
int_num2 = 3

add_num = int_num1 + int_num2
sub_num = int_num1 - int_num2
mul_num = int_num1 * int_num2
div_num1 = int_num1 / int_num2
div_num2 = int_num1 // int_num2
mod_num = int_num1 % int_num2
pow_num = int_num1 ** int_num2

print("Add : " + str(add_num))
print("Sub : " + str(sub_num))
print("Mul : " + str(mul_num))
print("Div : " + str(div_num1))
print("Div : " + str(div_num2))
print("Mod : " + str(mod_num))
print("Pow : " + str(pow_num))

実行結果

Add : 103
Sub : 97
Mul : 300
Div : 33.333333333333336
Div : 33
Mod : 1
Pow : 1000000


浮動小数点数(Floating Number)

また、小数点をつけると浮動小数点数として認識されます。
整数部分が0の場合は、省略することもできます。
浮動小数点数も整数と同様、加算( + )、減算( - )、乗算( * )、除算( / or // )、剰余算( % )、累乗算( ** )を行うことができます。

float_num1 = 3.14
float_num2 = .5

add_num = float_num1 + float_num2
sub_num = float_num1 - float_num2
mul_num = float_num1 * float_num2
div_num1 = float_num1 / float_num2
div_num2 = float_num1 // float_num2
mod_num = float_num1 % float_num2
pow_num = float_num1 ** float_num2

print("Add : " + str(add_num))
print("Sub : " + str(sub_num))
print("Mul : " + str(mul_num))
print("Div : " + str(div_num1))
print("Div : " + str(div_num2))
print("Mod : " + str(mod_num))
print("Pow : " + str(pow_num))

実行結果

Add : 3.64
Sub : 2.64
Mul : 1.57
Div : 6.28
Div : 6.0
Mod : 0.14000000000000012
Pow : 1.772004514666935


複素数(Complex Number)

「実数 + 虚数j」の形式で記述することで複素数として認識されます。
複素数は、加算( + )、減算( - )、乗算( * )、除算( / )を行うことができます。

complex_num1 = 10 + 8j
complex_num2 = 3 + 2j

add_num = complex_num1 + complex_num2
sub_num = complex_num1 - complex_num2
mul_num = complex_num1 * complex_num2
div_num = complex_num1 / complex_num2

print("Add : " + str(add_num))
print("Sub : " + str(sub_num))
print("Mul : " + str(mul_num))
print("Div : " + str(div_num))

実行結果

Add : (13+10j)
Sub : (7+6j)
Mul : (14+44j)
Div : (3.5384615384615383+0.3076923076923079j)


文字列 -> 数値変換

文字列から数値への変換は、int()、float()、complex()関数(コンストラクタ?)を使用します。
複素数文字列から複素数へ変換する場合は、余計な空白は入れてはいけないようです。("1 + 2j"など)

str_num1 = "100"
str_num2 = "3.14"

result_num = int(str_num1) * float(str_num2)

print(str_num1 + " * " + str_num2 + " = " + str(result_num))

str_num3 = "1+2j"

print(complex(str_num3))

実行結果

100 * 3.14 = 314.0


数学関数

数学関数を使用するには、mathライブラリをインポートする必要があります。

import math

数学関数は使用できる関数が非常に多いので、よく使いそうなものだけをピックアップして紹介します。


定数

よく使用される数学定数です。

print("π = " + str(math.pi))

print("e = " + str(math.e))

print("τ = " + str(math.tau))

print("∞ = " + str(math.inf))

print("NaN = " + str(math.nan))

実行結果

π = 3.141592653589793
e = 2.718281828459045
τ = 6.283185307179586
∞ = inf
NaN = nan


絶対値(fabs)
print("|3.5| = " + str(math.fabs(3.5)))
print("|-3.5| = " + str(math.fabs(-3.5)))

実行結果

|3.5| = 3.5
|-3.5| = 3.5


eの指数関数(exp)
print("e^2 = " + str(math.exp(2)))

実行結果

e^2 = 7.38905609893065


累乗(pow)
print("2^3 = " + str(math.pow(2, 3)))

実行結果

2^3 = 8.0


対数(log)
print("log2(8) = " + str(math.log(8, 2)))

print("log10(100) = " + str(math.log10(100)))

実行結果

log2(8) = 3.0
log10(100) = 2.0


平方根(sqrt)
print("√3 = " + str(math.sqrt(3)))

実行結果

√3 = 1.7320508075688772


床関数(floor)

床関数は実数xに対して、x以下の最大の整数を返します。

print("floor : 3.14 -> " + str(math.floor(3.14)))

実行結果

floor : 3.14 -> 3


天井関数(ceil)

天井関数は実数xに対して、x以上の最小の整数を返します。

print("ceil : 3.14 -> " + str(math.ceil(3.14)))

実行結果

ceil : 3.14 -> 4


切り捨て(trunc)

切り捨て関数は、小数点以下を切り捨てた整数を返します。

print("trunc : 3.14 -> " + str(math.trunc(3.14)))

実行結果

trunc : 3.14 -> 3


三角関数
print("sin(π/2) = " + str(math.sin(math.pi / 2)))

print("cos(π) = " + str(math.cos(math.pi)))

print("tan(π/4) = " + str(math.tan(math.pi * 0.25)))

print("asin(1) = " + str(math.asin(1)))

print("acos(1) = " + str(math.acos(1)))

print("atan(1) = " + str(math.atan(1)))

実行結果

sin(π/2) = 1.0
cos(π) = -1.0
tan(π/4) = 0.9999999999999999
asin(1) = 1.5707963267948966
acos(1) = 0.0
atan(1) = 0.7853981633974483


角度変換
print("180[deg] -> " + str(math.radians(180)) + "[rad]")

print("π[rad] -> " + str(math.degrees(math.pi)) + "[deg]")

実行結果

180[deg] -> 3.141592653589793[rad]
π[rad] -> 180.0[deg]


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)