Pythonで不変のデータ構造を実装する方法は?
問題
Pythonで不変のデータ構造を実装する必要があります。
はじめに..
不変のデータ構造は、複数の人が並列プログラミングで同時にデータを変更するのを防ぎたい場合に非常に便利です。可変データ構造(配列など)はいつでも変更できますが、不変データ構造は変更できません。
その方法..
不変および可変のデータ構造を処理する方法を段階的に説明します。
例
# STEP 01 - Create a Mutable array. # Define an array atp_players = ['Murray', 'Nadal', 'Djokovic'] print(f" *** Original Data in my array is - {atp_players}")
***私の配列の元のデータは-
です['Murray', 'Nadal', 'Djokovic']
# Changing the player name from Murray to Federer atp_players[0] = 'Federer' print(f" *** Modified Data in my array is - {atp_players}")に変更します
***私の配列の変更されたデータは-
です['Federer', 'Nadal', 'Djokovic']
結論
この配列の排他的ユーザーである場合に役立つ可能性があるのと同じように、配列の値を変更することができました。ただし、リアルタイムの本番環境では、複数のプログラムがこの配列を変更に使用している可能性があり、予期しないデータが発生する可能性があります。
一方、タプルの動作は少し異なります。以下の例をご覧ください。
# STEP 02 - Try changing a Tuple try: atp_players_tuple = ('Murray', 'Nadal', 'Djokovic') print(f" *** Original Data in my tuple is - {atp_players_tuple}") atp_players_tuple[0] = 'Federer' except Exception as error: print(f" *** Tried modifying data but ended up with - {error}")
*** Original Data in my tuple is - ('Murray', 'Nadal', 'Djokovic') *** Tried modifying data but ended up with - 'tuple' object does not support item assignment
結論:
上で見たのは、タプルは正しく変更できないということです。ただし、1つの例外があります。タプル内に配列がある場合、値を変更できます。
atp_players_array_in_tuple = (['Murray'], ['Nadal'], ['Djokovic']) print(f" *** Original Data in my tuple with arrays is - {atp_players_array_in_tuple}") atp_players_array_in_tuple[0][0] = 'Federer' print(f" *** Modified Data in my tuple with arrays is - {atp_players_array_in_tuple}")
*** Original Data in my tuple with arrays is - (['Murray'], ['Nadal'], ['Djokovic']) *** Modified Data in my tuple with arrays is - (['Federer'], ['Nadal'], ['Djokovic'])
では、データを保護する方法は?うーん、配列をタプルに変換するだけです。
try: atp_players_tuple_in_tuple = (('Murray'), ('Nadal'), ('Djokovic')) print(f" *** Original Data in my tuple is - {atp_players_tuple_in_tuple}") atp_players_tuple_in_tuple[0] = 'Federer' except Exception as error: print(f" *** Tried modifying data in my tuple but ended up with - {error}")
*** Original Data in my tuple is - ('Murray', 'Nadal', 'Djokovic') *** Tried modifying data in my tuple but ended up with - 'tuple' object does not support item assignment
もっとあります..PythonにはNamedTupleと呼ばれる素晴らしい組み込みツールがあります。これは、コンストラクターを作成するために拡張できるクラスです。プログラムで理解しましょう。
# Create a simple class on Grandslam titles in pythons way. class GrandSlamsPythonWay: def __init__(self, player, titles): self.player = player self.titles = titles stats = GrandSlamsPythonWay("Federer", 20) print(f" *** Stats has details as {stats.player} - {stats.titles}")の詳細があります
*** Stats has details as Federer - 20
このクラスについてどう思いますか、不変ですか?フェデラーをナダルに変えてチェックしてみましょう。
stats.player = 'Nadal' print(f" *** Stats has details as {stats.player} - {stats.titles}")
*** Stats has details as Nadal - 20
したがって、フェデラーをナダルに更新できるので、不変のデータ構造であることは当然のことです。次に、NamedTupleを使用してクラスを作成し、それがデフォルトの動作であるかどうかを確認しましょう。
from typing import NamedTuple class GrandSlamsWithNamedTuple(NamedTuple): player: str titles: int stats = GrandSlamsWithNamedTuple("Federer", 20) print(f" *** Stats has details as {stats.player} - {stats.titles}") stats.player = 'Djokovic' print(f" *** Stats has details as {stats.player} - {stats.titles}")
*** Stats has details as Federer - 20
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in 10 print(f" *** Stats has details as {stats.player} - {stats.titles}") 11 ---> 12 stats.player = 'Djokovic' 13 print(f" *** Stats has details as {stats.player} - {stats.titles}") AttributeError: can't set attribute
ジョコビッチが20のグランドスラムタイトルに到達するまでもう少し待たなければならなかったようです。
ただし、_replaceメソッドを使用して、_replace中にコピーを作成し、値を更新することができます。
djokovic_stats = stats._replace(player="Djokovic", titles=17) print(f" *** djokovic_stats has details as {djokovic_stats.player} - {djokovic_stats.titles}")
*** djokovic_stats has details as Djokovic - 17
例
最後に、上記で説明したすべてをカバーする1つの例を示します。
この例では、野菜屋向けのソフトウェアを作成していると仮定します。
from typing import Tuple # Create a Class to represent one purchase class Prices(NamedTuple): id: int name: str price: int # Price in dollars # Create a Class to track the purchase class Purchase(NamedTuple): purchase_id: int items: Tuple[Prices] # Create vegetable items and their corresponding prices carrot = Prices(1, "carrot", 2) tomato = Prices(2, "tomato", 3) eggplant = Prices(3, "eggplant", 5) # Now let say our first cusotmer Mr.Tom had purchased carrot and tomato tom_order = Purchase(1, (carrot, tomato)) # Know the total cost we need to charge Mr.Tom total_cost = sum(item.price for item in tom_order.items) print(f"*** Total Cost from Mr.Tom is - {total_cost}$")
出力
*** Total Cost from Mr.Tom is - 5$
-
非線形データをPythonのモデルにどのように適合させることができますか?
データの視覚化に役立つSeabornライブラリを使用します。回帰モデルを作成するときに、多重共線性がチェックされます。これは、連続変数のすべての異なる組み合わせの間に存在する相関関係を理解する必要があるためです。変数間に多重共線性が存在する場合は、それがデータから削除されていることを確認する必要があります。通常、実世界のデータは非線形です。 このような非線形データをモデルに適合させるメカニズムを見つける必要があります。このデータを視覚化するために、Anscombeのデータセットを使用します。 「implot」関数は、この非線形データで使用されます。 これが例です- 例 import pan
-
Pythonでチャートに凡例を追加する方法は?
はじめに... グラフの主な目的は、データを簡単に理解できるようにすることです。 「絵は千の言葉に値する」とは、言葉では表現できない複雑なアイデアを1つの画像/グラフで伝えることができることを意味します。 多くの情報を含むグラフを描画する場合、表示されるデータの理解を深めるために、凡例が関連情報を表示するのに役立つ場合があります。 その方法.. matplotlibでは、凡例を複数の方法で表示できます。特定のポイントに注意を引くための注釈は、読者がグラフに表示される情報を理解するのに役立ちます。 1. pythonコマンドプロンプトを開き、pip install matplotlibを