【入門】C#技術者の為のPython独学!変数の型編

Python入門
この記事は約16分で読めます。

Pythonで変数を使う際、「型」を宣言する必要ないとは言うものの、「型」は存在します。

Python の「型」も、C#と同じくクラスになりますので、ここでは標準で(特に何もライブラリを追加せずとも)使用できる「型」について、C#と比べながら解説していきます。

Pythonで使える主な型

Pythonの変数は動的型付け(実行時に代入する値によって型を決定)であり、C#でいうところの object 型に相当します。

Pythonで使える型は次のものがあります。

型名PythonC#解説
文字列strstringval = ‘abcde’ 又は val = “abcde”
整数intlongval = 123
実数floatdoubleval = 123.456
ブール(真偽)boolboolval = True 又は val = False
リストlistListPythonで配列といえば list になる。
val = [‘abcde’, 123, True]
タプルtupleTuple要素の変更が出来ない list
val = (‘abcde’, 123, True)
辞書dictionaryDictionaryval= {‘key1’ : ‘abcde’, ‘key2′ : 123,’key3’ : True}
セットset該当なしキーしか持たない辞書のようなもの
val = {‘abcde’,123,True}
NoneTypeNonenullC#のnullと同じ意味で使われるが,null はキーワードであるのに対して、NoneはNoneTypeという型を持つオブジェクトとして扱われる。
val = None

C#との大きな違いとして、文字列はシングルクォート、ダブルクォートのどちらでも使えることです。

また、C#におけるリストと辞書は、定義する際に要素の型を決める必要があります。

しかし、Pythonの場合、動的型付けがゆえに異なる型を含めることが可能です。

特に面白いのが辞書型で、キーに関しても型を問いません。

辞書のキーを0から始まる連番にすると、あたかもリストの様に番号で要素にアクセスすることが可能です。

通常は1つのリストや辞書に複数の型を混在させることは無いでしょうし、万が一混在させた場合は取り扱いがややこしくなるので、するべきではありません。

実用性はともかくとして、C#など静的型付け言語に慣れた技術者にとっては実に興味深いですね。

型の判定とサイズの取得

C#では、変数の型を取得するのに GetTypeメソッド を使いますが、Pythonの場合は type という組み込み関数が用意されています。

また、配列やリストのサイズを知りたい場合、C#においてはLength やCount というプロパティが用意されていますが、Pythonでは len という組み込み関数を使います。

C#では、リストや辞書の要素数を取得するため Count プロパティが用意されています。

Python にも count メソッドが用意されているのですが、これは単に要素の個数を数えてくれるのではなく、引数で指定した要素の個数をカウントしてくれます。

型変換

文字列を数値に変換したり、リストをタプルに変換するなどの型変換は、それぞれ専用の関数(実際には型のコンストラクタを使って変換)が用意されています。

変換方法関数名記述例と変換結果
文字列⇒整数int(文字列)int(‘123’) ⇒ 123
文字列⇒実数float(文字列)float(‘3.14’) ⇒ 3.14
数値⇒文字列str(整数又は実数)str(123) ⇒ ‘123’
タプル⇒リストlist(リスト)tuple([1,2,3,4,5]) ⇒ (1,2,3,4,5)
リスト⇒タプルtuple(タプル)tuple((1,2,3,4,5)) ⇒ [1,2,3,4,5]
整数⇒16進数文字列hex(整数)hex(123) ⇒ ‘0x80’
整数⇒2進数文字列bin(整数)bin(123) ⇒ ‘0b1111011’
2進数文字列⇒整数int(文字列,2)int(‘10000001’,2) ⇒ 129
int(‘0b10000001’,2) ⇒ 129
16進数文字列⇒整数int(文字列,16)int(‘7F’,16) ⇒ 127
int(‘7f’,16) ⇒ 127
int(‘0x7f’,16) ⇒ 127

それぞれの型の解説

それでは、それぞれの型についてのポイントを、C#と比較しながら解説したいと思います。

文字列(str) 型

基本的にはC# の string型と同じであり、文字の集合(配列)として扱うことが可能です。

文字列の任意の位置から任意の数だけ取得する場合、C# では Substring メソッドに開始位置と長さを指定します。

一方、Pythonの場合は添え字部分に [開始位置 : 終了位置] と記述するだけでOKです。

この添え字による指定方法の事をスライスと呼び、文字列や後述するリストでよく使われますので、ここでしっかり覚えておきましょう。

C#とPythonのどちらも添え字は0から始まりますが、C#のSubstring が開始位置と長さを指定するのに対し、Pythonの添え字スライスは開始位置と終了位置を指定することにご注意ください。

また、終了位置は range(開始位置、終了位置) と同じ考え方になるため、終了位置の手前までが範囲になります。

ちなみに、スライスにはステップを指定することが可能で、[開始位置 : 終了位置:ステップ] という記述が可能であり、range(開始値、終了値、ステップ) と考え方は同じです。

整数型

Python の int は C#のlong なので、符号付き 64 ビット整数(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807) かと思いきや、そうではありません。

Python3 から上限が無くなったようで、メモリの許す限り無限に桁を増やすことが出来るようです。

例えば、下記の様な値を変数に入れたとしても、正しく計算ができます。すごい!

実数型

Python の float は C#のdoubleと同じで、-1.7976931348623157e+308 ~ 1.7976931348623157e+308 の値を扱うことが出来ます。

ブール(真偽)

Pythonのブールは True 又は False の2値が取り扱えますので、先頭が大文字か小文字かの違いはあっても、中身はC#と同じです。

リスト

リストは要素の削除や追加が可能な配列であり、C#のリストと基本的に同じです。

逆に、C#でいうところの静的配列( int[],string[][],double[,,,] 等)はありませんので、配列といえばリストを指します。

PythonのリストはC#に無い便利な機能があるので、是非押さえておきましょう。

添え字(スライス)による取り出し

文字列のところで少し説明しましたが、リストは添え字部分に 取り出したい範囲を、[開始位置 : 終了位置:ステップ] として指定することが可能です。

ループと条件を使ったリストの作成

Python のリストにはもう1つ特徴があって、新しいリストを作成する場合、for や if を組み合わせてリストを作り出すことが出来ます。

 [式 for 任意の変数名 in 配列構造のデータ if 条件式]

例えば、1~5 の値を二乗したリストを作りたい場合、次のようになります。

もし、3の二乗だけを計算したくないのであれば末尾にif 文を付けて次のように記述します。

C#でいうところの Linq の様な記述が添え字の中で出来てしまうのです。

これを利用すると、特定のリストから指定した条件で値を抜き出し、新たなリストを作ることが出来ます。

例えば、1~15の値が格納されている data に対して、偶数の値だけを取り出す場合は次のように記述できます。

もう少し実用的な例を考えてみましょう。

名前が格納されている name に対して、”藤” という文字が含まれている要素だけ取り出す場合、次のように記述します。

これをLinqを使ってC#で書くと次のようになります。

C#の方が字数が多くて、ちょっとごちゃごちゃした感じに見えます。

リストの初期化、追加、削除

リストに値を入れて初期化する場合は今までに解説した通りですが、時には空のリストを作りたい場合があります。

この場合は次の記述になります。

リストへの挿入、追加、削除は次のメソッドが用意されています。

追加append(値)
挿入insert(挿入位置,値)
値による削除remove(値)
添え字による削除pop(位置)

添え字(スライス)を使った置換

添え字で指定した範囲を別のリストの値で置き換えることが可能です。

この場合は、指定した範囲にある要素の個数(下記の場合は3個)と、置き換えたいリストの要素の個数を等しくしておきます。

もし、指定した範囲にある要素の個数より、多い要素を持つリストを代入した場合はどうなるでしょう?

この場合は、溢れた要素数(下記の場合は1個)が挿入されます。

添え字(スライス)を使った挿入

任意のリストに対して、添え字を指定した範囲に別のリストの値を代入することで「置き換え」が出来ました。

その際、代入するリストの要素の個数が大きい場合、溢れた要素は挿入されると言いましたね。

ということは、指定した範囲を1つだけにして、そこに別のリストの値を代入すれば、まるまる挿入できるということです。

尚、指定位置の直前に挿入される点にご注意ください。

その他のメソッド

今までに append,insert,pop,remove を紹介しましたが、そのほかに次のメソッドが用意されています。

extend(リスト)2つのリストを結合する。
data1.extend(data2) とすることで、data1の末尾にdata2が追加される。
複数のリストを結合する場合は+で結合が可能。
data = data1 + data2 + ・・・
index(値)指定した値を検索し、最初に見つかった位置(インデックス)を返す。
data.index(‘abc’)
reversリストの並びを反転させる。
data.revers()
sortリストを並び替える。
data.sort()
clearリストを空にする。
data.clear()
count(値)指定した値がリストに何個あるかを数える
data.count(‘abc’)

タプル

Python のタプルはC#と同様に、要素の書き換えや追加、削除が出来ない点は同じですが、そのアクセス方法が異なります。

C#のタプルは要素毎に名前を付けることが可能で、名前を付けない場合は自動的に item1,item2,・・・の様な要素名が付与され、これを使ってアクセスします。

一方、Pythonのタプルは要素に名前を付けることができず、リストと同じく添え字で各要素にアクセスします。

つまり、Pythonのタプルは「要素が書き換えらえないリスト」だと考える事が出来ます。

ということは、リストで使える添え字部分にスライスや for 、if 文を記述して、値を取り出すことが可能だということです。

値が書き換えられないことから、用意されているメソッドは count と index の2つしかありません。

値が書き換えられないとはいっても、タプルの値として辞書やリストが含まれている場合、それらは書き換え可能です。

辞書

Pythonの辞書(dictionary)は、KeyとValue のペアを1つの単位として管理するもので、Key の重複は出来ないという点はC#と同じです。

しかし、C#のDictionaryよりも手軽に要素(ペア)の追加が可能で、登録順は保持されているところが大きく異なります。

代入する際に指定したキーが辞書に存在すれば値の書き換え、存在しない場合は追加となります。

ちなみに登録順は保持されているというものの、任意の位置に追加は出来ません

全ての要素をループで取り出したい場合は次のようになります。

キーが存在しない場合だけ要素を追加する

辞書名[キー] = 値

と記述することで、書き換えと追加が可能ですが、キーがあれば値をそのままにしておいて、無い時だけ追加したいケースがあります。

キーに含まれるかチェックして、無ければ追加するのですから、if 文を使って次のように書くことが出来ます。

しかし、Pythonでは setdefault(キー、値)というメソッドが用意されています。

既存の辞書に丸ごと別の辞書を追加

辞書の末尾に別の辞書を丸ごと追加したい場合、 update(辞書名) というメソッドを使います。

dic の末尾に dic2 の内容が追加されたのが分かると思います。

dic と dic2 には 値が異なる同一キー ‘key1’ の要素があり、’key1’ が 999 に書き換わっていますが、2つの辞書に同一キーが存在する場合は、追加した辞書の値で上書きされます。

辞書の要素をループで取り出す

タプルやリストから全ての要素を取り出す場合、特に何も考えずループ処理を使うだけなのですが、辞書はキーと値がセットになっているため、少し注意が必要です。

C#の場合、単純に for ループで辞書を参照するとキーと値がペアーになった KeyValuePare という型が返されますが、Pythonの場合は キーだけが返されます。

C#には、キーだけをコレクションとして返す Keys、値をコレクションとして返す Values が用意されていますが、Pythonでは keys()、values() というメソッドが用意されています。

また、キーと値の両方を取り出す場合は、items() メソッドが用意されており、各要素をタプルで取得することが出来ます。

セット

例えば大量データの中から重複データを排除したい場合、C#だと辞書のキー部分だけを使って重複チェックを行うか、Linq を使うことになります。

Python には重複データを許さない set という型が用意されています。

辞書も重複データを許さないので、set はキー部だけを持つ辞書と考える事が出来ます。

変数を初期化する際、リストは [] 、タプルは () 、辞書は {} を使いましたが、セットも {} が使えます。

  {要素1,要素2,要素3,・・・}

また、set という関数(実際はset クラスのコンストラクタが呼び出される)の引数にリスト形式で要素を渡して初期化することも出来ます。

  set( [要素1,要素2,要素3・・・] )

もう少し具体的に書くと次のようになります。

set を使うと、このように重複データを排除してくれるのです。

set関数と list 関数を組み合わせることで、リストから重複を簡単に除くことができます。

各要素のアクセス

セットの各要素に対して添え字でアクセスすることは出来ません

ただ、for ループを使って全て取り出す事は出来ます。

要素の追加、変更、削除

添え字による要素の書き換えは出来ませんが、要素の追加、削除、クリアのメソッドは用意されています。

機能メソッド名動作
追加add(キー)指定したキーを追加する
削除remove(キー)存在しないキーを指定するとエラーになる
削除discard(キー)存在しないキーを指定してもエラーにならない
削除pop(キー)セットをスタックとみなし、末尾から1つキーを取り出して返す
クリアclear()全てのキーをクリアし、空のセットにする

集合計算

セットの主な使い方は集合計算です。

2つのセットに対して、和集合、席集合、差集合を求めることが出来ます。

s1= set([1,2,3,4,5]) s2=set([4,5,6,7,8]) が代入されていると仮定すると、

名前記述意味結果
和集合s1 | s2
s1.union(s2)
s1とs2が合算され、重複は排除「1,2,3,4,5,6,7,8]
積集合s1 & s2
s1.intersection(s2)
s1とs2の両方に存在するもの[4,5]
差集合s1 – s2
s1.difference(s2)
s1にしか存在しないもの[1,2,3]
排他的論理和集合s1 ^ s2
s1.symmetric_difference(s2)
s1とs2のお互いに存在しないもの
=和集合から積集合を引いたもの
[1,2,3,6,7,8]

また、部分集合であるかの判定が行えます。

s1= set([1,2,3,4,5]) s2=set([1,2,3]) が代入されていると仮定すると

メソッド名記述例意味
issubsets1.issubset(s2)s1がs2の部分集合(s1の全要素がs2に含まれているか)を判定
issupersets1.issuperset(s2)s1がs2の上位集合(s2の全要素がs1に含まれているか)を判定
isdisjoints1.isdisjoint(s2)s1とs2の間に重複があるかを判定

issubset と issuperset は s1 から見て s2 がどういう集合かを判定するものなので、結果が反対になります。

まとめ

今回はインポートせずに使えるPythonの標準的な変数の型について、一通り解説しました。

また、複数の要素で構成されるリストやタプル、辞書、セットについては、C#と比較しながら詳しく解説しました。

今回の内容はPythonの基礎として押さえておきたいポイントです。

機械学習や数値計算では numpy や pandas というクラスが登場しますが、この説明は次回以降に詳しく解説していきます。

タイトルとURLをコピーしました