見出し画像

pythonプログラム初歩の初歩15/辞書を扱うためのメソッド

pythonプログラム初歩の初歩15/
辞書を扱うためのメソッド


こんにちはmakokonです。久々(というほどでもないけど)にpythonプログラムの初歩です。
Pythonプログラミングの初心者向けシリーズ、第15回目へようこそ。今回は、Pythonの辞書(dictionary)を扱うための便利なメソッドについて詳しく解説します。辞書は、Pythonで頻繁に使用される強力なデータ構造ですが、その潜在能力を最大限に引き出すには、これらのメソッドを理解し活用することが重要です。本記事では、辞書操作を効率的に行うための主要なメソッドを紹介し、それぞれの使用方法と利点を説明します。


今回紹介するメソッド

今回紹介するメソッドを表にまとめました。
表には、メソッドの名称、入力データ、出力ダータのタイプ、出力データが記載されています。
相変わらず表を貼るのは面倒ですね。今回はおまけにあるようにTexを利用して貼っています。

$$
\begin{array}{|l|l|l|l|}\hline\text{メソッド} & \text{入力辞書} & \text{出力タイプ} & \text{出力結果} \\\hline\text{.keys()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict\_keys} & \text{dict\_keys(['a', 'b'])} \\\hline\text{.values()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict\_values} & \text{dict\_values([1, 2])} \\\hline\text{.items()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict\_items} & \text{dict\_items([('a', 1), ('b', 2)])} \\\hline\text{.get('b')} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 2 \\\hline\text{.pop('a')} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 1 \\\hline\text{.popitem()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{tuple} & \text{('b', 2)} \\\hline\text{.update(\{'c': 3\})} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{None} & \{\text{'a'}: 1, \text{'b'}: 2, \text{'c'}: 3\} \\\hline\text{.setdefault('d', 4)} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 4 \\\hline\text{.clear()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{None} & \{\} \\\hline\text{.copy()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict} & \{\text{'a'}: 1, \text{'b'}: 2\} \\\hline\text{.fromkeys(['e', 'f'], 5)} & - & \text{dict} & \{\text{'e'}: 5, \text{'f'}: 5\} \\\hline\text{.update()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{None} & \{\text{'a'}: 1, \text{'b'}: 2\} \\\hline\text{.setdefault('b', 6)} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 2 \\\hline\text{.pop('g', 0)} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 0 \\\hline\end{array}
$$

出力の確認

まず、いきなりですが14メソッドのそれぞれの出力を確認してみましょう。
以下のコードを実行してみます。(lesson15-0.py)

# 入力辞書
d = {'a': 1, 'b': 2}

# .keys()
print(d.keys())

# .values()
print(d.values())

# .items()
print(d.items())

# .get('b')
print(d.get('b'))

# .pop('a')
d_pop = d.copy()  # コピーを作成して変更を避ける
print(d_pop.pop('a'))

# .popitem()
d_popitem = d.copy()  # コピーを作成して変更を避ける
print(d_popitem.popitem())

# .update({'c': 3})
d_update = d.copy()
d_update.update({'c': 3})
print(d_update)

# .setdefault('d', 4)
d_setdefault = d.copy()
print(d_setdefault.setdefault('d', 4))

# .clear()
d_clear = d.copy()
d_clear.clear()
print(d_clear)

# .copy()
d_copy = d.copy()
print(d_copy)

# .fromkeys(['e', 'f'], 5)
print(dict.fromkeys(['e', 'f'], 5))

# .update() (with no changes)
d_no_change = d.copy()
d_no_change.update()
print(d_no_change)

# .setdefault('b', 6)
d_setdefault_existing = d.copy()
print(d_setdefault_existing.setdefault('b', 6))

# .pop('g', 0)
d_pop_default = d.copy()
print(d_pop_default.pop('g', 0))

実行結果がこちら

$ python --version    
Python 3.11.2

$ python lesson15-0.py 
dict_keys(['a', 'b'])
dict_values([1, 2])
dict_items([('a', 1), ('b', 2)])
2
1
('b', 2)
{'a': 1, 'b': 2, 'c': 3}
4
{}
{'a': 1, 'b': 2}
{'e': 5, 'f': 5}
{'a': 1, 'b': 2}
2
0

それぞれのメソッドの説明

今回紹介したPythonの辞書メソッドを解説します。

  1. .keys(): 辞書の全てのキーを返します。

  2. .values(): 辞書の全ての値を返します。

  3. .items(): 辞書のキーと値のペアをタプルのリストとして返します。

  4. .get('y'): 指定したキー('y')の値を返します。キーが存在しない場合はNoneを返します。

  5. .pop('x'): 指定したキー('x')を削除し、その値を返します。

  6. .popitem(): 最後に挿入されたキーと値のペアを削除し、そのペアを返します。

  7. .update({'z':30}): 辞書を更新し、新しいキーと値のペアを追加または既存のキーの値を更新します。

  8. .setdefault('y', 50): 指定したキーの値を返します。キーが存在しない場合はキーを追加し、指定したデフォルト値を設定します。

  9. .clear(): 辞書から全ての要素を削除します。

  10. .copy(): 辞書のシャローコピーを返します。

  11. .fromkeys(['x', 'y'], 10): 指定したキーのリストと値を使って新しい辞書を作成します。

  12. .update(): 他の辞書やペアのイテラブルから要素を追加または更新します。

  13. .setdefault(key, default): キーが存在する場合はその値を返し、存在しない場合はキーを追加しデフォルト値を設定します。

  14. .pop(key, default): 指定したキーを削除し、その値を返します。キーが存在しない場合はデフォルト値を返します。

もちろん、これらのメッソッドを知らなくても、プログラムを書くことは可能です。でも、単純な作業を長々と書くのは可読性も悪いし、keyのチェックなど、エラー対策にも気を使わないといけません。
これらのメソッドは、辞書の操作を簡素化し、コードの可読性と効率性を向上させます。

シャローコピーとは何?

説明の中で初心者には耳慣れない言葉がありますね。.copyメソッドで作られるシャローコピーとは何でしょうか?
シャローコピー(shallow copy)は、オブジェクトのコピーを作成する方法の一つで、元のオブジェクトと同じ内容を持つ新しいオブジェクトを作成しますが、元のオブジェクト内の参照(例えばネストされたリストや辞書などの複合オブジェクト)はそのままコピーされることを意味します。つまり、コピーしたオブジェクトと元のオブジェクトは、ネストされたオブジェクトを共有します。

具体例を挙げると、Pythonのリストや辞書でシャローコピーを行うと、リストや辞書の直下の要素は新しいオブジェクトにコピーされますが、それらの要素が参照しているオブジェクト(例えばリストの中のリスト)は、元のオブジェクトと新しいオブジェクトで共有されます。
つまり、大切なのは、

  • 共有されるのはオブジェクトへの参照: ネストされたオブジェクト(リスト内のリスト)は、元のリストとシャローコピーの両方で共有されますが、そのオブジェクト自体をどちらかのリストから削除しても、もう一方には影響しません。

  • 共有される参照の変更: ネストされたオブジェクト内のデータを変更すると、その変更は両方に反映されます(例: shallow_copied_list[2][0] = 99)。

念の為、実際にコードで確認してみます。

シャローコピー確認コード(lesson15-1.py)


import copy

# 元のリストを定義
original_list = [1, 2, [3, 4]]

# シャローコピーを作成
shallow_copied_list = copy.copy(original_list)

# 元のリストとコピーされたリストが異なるオブジェクトかどうかを確認
print("元のリストとシャローコピーは同じオブジェクトか?:", original_list is shallow_copied_list)  # 出力: False

# ネストされたリストが同じオブジェクトを参照しているかどうかを確認
print("ネストされたリストは同じオブジェクトか?:", original_list[2] is shallow_copied_list[2])  # 出力: True

# シャローコピーのネストされていない要素を変更し、元のリストに影響がないかを確認
shallow_copied_list[0] = 99
print("ネストされていない要素を変更後 - 元のリスト:", original_list)  # 出力: [1, 2, [3, 4]]
print("ネストされていない要素を変更後 - シャローコピー:", shallow_copied_list)  # 出力: [99, 2, [3, 4]]

# ネストされたリストの要素を変更し、元のリストに影響があるかどうかを確認
shallow_copied_list[2][0] = 99
print("ネストされた要素を変更後 - 元のリスト:", original_list)  # 出力: [1, 2, [99, 4]]
print("ネストされた要素を変更後 - シャローコピー:", shallow_copied_list)  # 出力: [99, 2, [99, 4]]

# ネストされたリスト自体を削除し、元のリストに影響があるかどうかを確認

del shallow_copied_list[2]

# 結果の確認
print("ネストされたリストを削除後 - 元のリスト:", original_list)  # 出力: [1, 2, [99, 4]]
print("ネストされたリストを削除後 - シャローコピー:", shallow_copied_list)  # 出力: [99, 2]

その実行結果がこれ。
シャローコピーはとても便利ですが、単なるコピー(全くの別物)やリンクコピー(実態は同じもの)と勘違いして思わぬ事故が起きるかもしれません。一応気にかけておきましょう。

$ python lesson15-1.py
元のリストとシャローコピーは同じオブジェクトか?: False
ネストされたリストは同じオブジェクトか?: True
ネストされていない要素を変更後 - 元のリスト: [1, 2, [3, 4]]
ネストされていない要素を変更後 - シャローコピー: [99, 2, [3, 4]]
ネストされた要素を変更後 - 元のリスト: [1, 2, [99, 4]]
ネストされた要素を変更後 - シャローコピー: [99, 2, [99, 4]]
ネストされたリストを削除後 - 元のリスト: [1, 2, [99, 4]]
ネストされたリストを削除後 - シャローコピー: [99, 2]

まとめ

いかがでしたか、本記事では、Pythonの辞書を操作するための重要なメソッドを紹介しました。これらのメソッドを適切に使用することで、コードの可読性が向上し、辞書の操作がより効率的になります。
また、シャローコピーの概念についても触れ、データ構造の深い理解の重要性を強調しました。
これらの知識は、Pythonプログラミングのスキルを向上させ、より洗練されたコードを書く上で非常に有用です。辞書メソッドを積極的に活用し、より効果的なPythonプログラミングを目指しましょう。


ぜひ、試してみてください。
なお、使い方そのものをしっかり覚えていなくても「こんなことは簡単にできたはず」とだけなんとなく覚えておけば、利用することは簡単でしょう。
ChatGPTとかは、いつでもていねいに教えてくれますし。


ハッシュタグ
#PythonDictionary #PythonTips #CodingTutorial #PythonProgramming #DataStructures #PythonMethods #LearnPython #PythonBeginner #CodeEfficiency #PythonDevelopment
#Python辞書 #Python入門 #プログラミング学習 #Pythonテクニック #データ構造 #Pythonメソッド #プログラミング初心者 #コーディングテクニック #Python開発 #プログラミング効率化


おまけ noteで直接表をかけないかな。

texを利用してnoteに表を挿入するための人気記事がたくさんあります。
それだけ、皆さん表を書くのに苦労しているんでしょうね。


なかなか便利な方法だと思ったので、実際に試してみました。
若干プロンプトを修正して、マークダウンで作成した表を直接Texに書き換えてもらっています。

ChatGPTに以下のプロンプトを与えて、Texを直接生成してもらいました。わざわざTexの表記方法を説明しなくても行けるかと思ったのですが、対応している表現方法が限定的な可能性があるので使用する機能を限定して説明しています。

これから示すのはtex形式で表を表現するための手法です。念の為掲載します。この方式に従って下記のマークダウンの表を表現してください。

TeXは数式を書くための記法で、表を作成する際には以下のような形式で書きます。

rubyCopy code$$ \begin{array}{|c|c|c|} \hline 1 & 2 & 3 \\ \hline 4 & 5 & 6 \\ \hline 7 & 8 & 9 \\ \hline \end{array} $$

ここで、|c|c|c|はそれぞれの列の位置と縦線を示しています。「c」はcenter(中央寄せ)を意味し、左寄せしたい場合は「l」(left)、右寄せしたい場合は「r」(right)を使用します。また、「&」は列の区切りを、「\」は改行を表します。

縦線は|c|c|c|の「|」で表示し、横線は\hlineで表示します。これらの記号を適宜追加または削除することで、表の形状を自由に変更できます。

また、TeXは数式を書くための記法なので、英字を表示するには\text{abc}のように書きます。これにより、「abc」のように英字を表示できます。

ChatGPTの出力をnoteエディターの引用枠に貼り付けると以下のようになります。今回もこの方法を利用させてもらいました。Gistのリンクを貼り付ける方法も悪くないですが、手元で解決したかったので、悪くない方法でした。

$$
\begin{array}{|l|l|l|l|}
\hline
\text{メソッド} & \text{入力辞書} & \text{出力タイプ} & \text{出力結果} \\
\hline
\text{.keys()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict\_keys} & \text{dict\_keys(['a', 'b'])} \\
\hline
\text{.values()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict\_values} & \text{dict\_values([1, 2])} \\
\hline
\text{.items()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict\_items} & \text{dict\_items([('a', 1), ('b', 2)])} \\
\hline
\text{.get('b')} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 2 \\
\hline
\text{.pop('a')} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 1 \\
\hline
\text{.popitem()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{tuple} & \text{('b', 2)} \\
\hline
\text{.update(\{'c': 3\})} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{None} & \{\text{'a'}: 1, \text{'b'}: 2, \text{'c'}: 3\} \\
\hline
\text{.setdefault('d', 4)} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 4 \\
\hline
\text{.clear()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{None} & \{\} \\
\hline
\text{.copy()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{dict} & \{\text{'a'}: 1, \text{'b'}: 2\} \\
\hline
\text{.fromkeys(['e', 'f'], 5)} & - & \text{dict} & \{\text{'e'}: 5, \text{'f'}: 5\} \\
\hline
\text{.update()} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{None} & \{\text{'a'}: 1, \text{'b'}: 2\} \\
\hline
\text{.setdefault('b', 6)} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 2 \\
\hline
\text{.pop('g', 0)} & \{\text{'a'}: 1, \text{'b'}: 2\} & \text{int} & 0 \\
\hline
\end{array}
$$

Texで書いた表

参考までにマークダウンの表はこちら。そのまんまですね。早くサポートしてほしい。



| メソッド | 入力辞書 | 出力タイプ | 出力結果 |
|-----------------------------|-----------------|---------------|----------------------------------------------|
| `.keys()` | `{'a': 1, 'b': 2}` | `dict_keys` | `dict_keys(['a', 'b'])` |
| `.values()` | `{'a': 1, 'b': 2}` | `dict_values` | `dict_values([1, 2])` |
| `.items()` | `{'a': 1, 'b': 2}` | `dict_items` | `dict_items([('a', 1), ('b', 2)])` |
| `.get('b')` | `{'a': 1, 'b': 2}` | `int` | `2` |
| `.pop('a')` | `{'a': 1, 'b': 2}` | `int` | `1` |
| `.popitem()` | `{'a': 1, 'b': 2}` | `tuple` | `('b', 2)` |
| `.update({'c': 3})` | `{'a': 1, 'b': 2}` | `None` | `{'a': 1, 'b': 2, 'c': 3}` |
| `.setdefault('d', 4)` | `{'a': 1, 'b': 2}` | `int` | `4` |
| `.clear()` | `{'a': 1, 'b': 2}` | `None` | `{}` |
| `.copy()` | `{'a': 1, 'b': 2}` | `dict` | `{'a': 1, 'b': 2}` |
| `.fromkeys(['e', 'f'], 5)` | `-` | `dict` | `{'e': 5, 'f': 5}` |
| `.update()` | `{'a': 1, 'b': 2}` | `None` | `{'a': 1, 'b': 2}` (変更なし) |
| `.setdefault('b', 6)` | `{'a': 1, 'b': 2}` | `int` | `2` (既存の値) |
| `.pop('g', 0)` | `{'a': 1, 'b': 2}` | `int` | `0` (キーがないためデフォルト値) |



いいなと思ったら応援しよう!