Pythonで変数を使う際、「型」を宣言する必要ないとは言うものの、「型」は存在します。
Python の「型」も、C#と同じくクラスになりますので、ここでは標準で(特に何もライブラリを追加せずとも)使用できる「型」について、C#と比べながら解説していきます。
Pythonで使える主な型
Pythonの変数は動的型付け(実行時に代入する値によって型を決定)であり、C#でいうところの object 型に相当します。
Pythonで使える型は次のものがあります。
型名 | Python | C# | 解説 |
---|---|---|---|
文字列 | str | string | val = ‘abcde’ 又は val = “abcde” |
整数 | int | long | val = 123 |
実数 | float | double | val = 123.456 |
ブール(真偽) | bool | bool | val = True 又は val = False |
リスト | list | List | Pythonで配列といえば list になる。 val = [‘abcde’, 123, True] |
タプル | tuple | Tuple | 要素の変更が出来ない list val = (‘abcde’, 123, True) |
辞書 | dictionary | Dictionary | val= {‘key1’ : ‘abcde’, ‘key2′ : 123,’key3’ : True} |
セット | set | 該当なし | キーしか持たない辞書のようなもの val = {‘abcde’,123,True} |
NoneType | None | null | C#のnullと同じ意味で使われるが,null はキーワードであるのに対して、NoneはNoneTypeという型を持つオブジェクトとして扱われる。 val = None |
C#との大きな違いとして、文字列はシングルクォート、ダブルクォートのどちらでも使えることです。
また、C#におけるリストと辞書は、定義する際に要素の型を決める必要があります。
1 2 3 4 |
//C#のリスト型 List<string> val = new List<string>(){"abc","123","AAA"}; //C#の辞書型 Dictionary<string, int> val3 = new Dictionary<string, int>() { { "key1", 123 }, { "key2", 456 } }; |
しかし、Pythonの場合、動的型付けがゆえに異なる型を含めることが可能です。
特に面白いのが辞書型で、キーに関しても型を問いません。
1 2 3 4 5 |
#Pythonのリスト型 val = ['abcde', 123, True] #Pythonの辞書型 val= {'key1' : 'abcde', 'key2' : 123,'key3' : True} |
辞書のキーを0から始まる連番にすると、あたかもリストの様に番号で要素にアクセスすることが可能です。
1 2 3 |
#どちらも添え字0,1,2 で要素にアクセスできる val = {0:123,1:456,2:789} #辞書型 val = [123,456,789] #リスト型 |
通常は1つのリストや辞書に複数の型を混在させることは無いでしょうし、万が一混在させた場合は取り扱いがややこしくなるので、するべきではありません。
実用性はともかくとして、C#など静的型付け言語に慣れた技術者にとっては実に興味深いですね。
型の判定とサイズの取得
C#では、変数の型を取得するのに GetTypeメソッド を使いますが、Pythonの場合は type という組み込み関数が用意されています。
1 2 |
data = [1,2,3,4,5] print( type(data) ) |
また、配列やリストのサイズを知りたい場合、C#においてはLength やCount というプロパティが用意されていますが、Pythonでは len という組み込み関数を使います。
1 2 |
data = [1,2,3,4,5]; print( len(data) ) |
C#では、リストや辞書の要素数を取得するため Count プロパティが用意されています。
Python にも count メソッドが用意されているのですが、これは単に要素の個数を数えてくれるのではなく、引数で指定した要素の個数をカウントしてくれます。
1 2 3 4 |
data = [1,2,3,4,5,5,6] print(data.count(5)) この場合、5が2個あるので、結果として2が返される |
型変換
文字列を数値に変換したり、リストをタプルに変換するなどの型変換は、それぞれ専用の関数(実際には型のコンストラクタを使って変換)が用意されています。
変換方法 | 関数名 | 記述例と変換結果 |
---|---|---|
文字列⇒整数 | 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型と同じであり、文字の集合(配列)として扱うことが可能です。
1 2 3 4 5 6 7 |
//C# string data = "abcdefg"; char ch = data[1]; #Python data = 'abcdefg' ch = data[3] |
文字列の任意の位置から任意の数だけ取得する場合、C# では Substring メソッドに開始位置と長さを指定します。
一方、Pythonの場合は添え字部分に [開始位置 : 終了位置] と記述するだけでOKです。
この添え字による指定方法の事をスライスと呼び、文字列や後述するリストでよく使われますので、ここでしっかり覚えておきましょう。
C#とPythonのどちらも添え字は0から始まりますが、C#のSubstring が開始位置と長さを指定するのに対し、Pythonの添え字(スライス)は開始位置と終了位置を指定することにご注意ください。
また、終了位置は range(開始位置、終了位置) と同じ考え方になるため、終了位置の手前までが範囲になります。

1 2 3 4 5 6 7 8 9 10 11 |
//C# string data = "abcdefg"; string part = data.Substring(2,4); //SubString(開始位置,長さ) ※出力結果として "cdef" が返される #Python var = 'abcdefg' part = data[2:4] #[開始位置,終了位置] ※出力結果として "cd" が返される |
ちなみに、スライスにはステップを指定することが可能で、[開始位置 : 終了位置:ステップ] という記述が可能であり、range(開始値、終了値、ステップ) と考え方は同じです。

整数型
Python の int は C#のlong なので、符号付き 64 ビット整数(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807) かと思いきや、そうではありません。
Python3 から上限が無くなったようで、メモリの許す限り無限に桁を増やすことが出来るようです。
例えば、下記の様な値を変数に入れたとしても、正しく計算ができます。すごい!
1 |
data = 9223372036854775807000000000000000000000000000000000000000000000000000000000000000000000000000000001 |
実数型
Python の float は C#のdoubleと同じで、-1.7976931348623157e+308 ~ 1.7976931348623157e+308 の値を扱うことが出来ます。
ブール(真偽)
Pythonのブールは True 又は False の2値が取り扱えますので、先頭が大文字か小文字かの違いはあっても、中身はC#と同じです。
リスト
リストは要素の削除や追加が可能な配列であり、C#のリストと基本的に同じです。
逆に、C#でいうところの静的配列( int[],string[][],double[,,,] 等)はありませんので、配列といえばリストを指します。
PythonのリストはC#に無い便利な機能があるので、是非押さえておきましょう。
添え字(スライス)による取り出し
文字列のところで少し説明しましたが、リストは添え字部分に 取り出したい範囲を、[開始位置 : 終了位置:ステップ] として指定することが可能です。
1 2 3 4 5 6 7 8 |
data = [1,2,3,4,5,6,7,8] print( data[2:6] ) ※3,4,5,6 が表示される print( data[2:5:3] ) ※3,6が表示される |
ループと条件を使ったリストの作成
Python のリストにはもう1つ特徴があって、新しいリストを作成する場合、for や if を組み合わせてリストを作り出すことが出来ます。
[式 for 任意の変数名 in 配列構造のデータ if 条件式]
例えば、1~5 の値を二乗したリストを作りたい場合、次のようになります。
1 2 3 |
print([x * x for x in range(1,6)]) #1~5の数値を作るため、rangeは1~6を指定 ※ [1, 4, 9, 16, 25] が表示される |
もし、3の二乗だけを計算したくないのであれば末尾にif 文を付けて次のように記述します。
1 2 3 |
print( [x * x for x in range(1,6) if x != 3] ) ※ [1, 4, 16, 25] が表示される |
C#でいうところの Linq の様な記述が添え字の中で出来てしまうのです。
これを利用すると、特定のリストから指定した条件で値を抜き出し、新たなリストを作ることが出来ます。
例えば、1~15の値が格納されている data に対して、偶数の値だけを取り出す場合は次のように記述できます。
1 2 3 4 |
data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] print([x for x in data if x % 2 == 0]) ※[2, 4, 6, 8, 10, 12, 14] が表示される |
もう少し実用的な例を考えてみましょう。
名前が格納されている name に対して、”藤” という文字が含まれている要素だけ取り出す場合、次のように記述します。
1 2 3 4 |
name = ["田中","山田","鈴木","佐藤","高橋","伊藤","渡辺","山本","中村","小林"] print([x for x in name if '藤' in x]) ※['佐藤', '伊藤'] が表示される |
これをLinqを使ってC#で書くと次のようになります。
1 2 3 4 |
List<string> name = new List<string>(){"田中","山田","鈴木","佐藤","高橋","伊藤","渡辺","山本","中村","小林"}; Console.WriteLine(name.Where(i=>i.Contains("藤")).ToList(); ※['佐藤', '伊藤'] が表示される |
C#の方が字数が多くて、ちょっとごちゃごちゃした感じに見えます。
リストの初期化、追加、削除
リストに値を入れて初期化する場合は今までに解説した通りですが、時には空のリストを作りたい場合があります。
この場合は次の記述になります。
1 2 3 |
data = [] 又は data = list() |
リストへの挿入、追加、削除は次のメソッドが用意されています。
追加 | 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,・・・の様な要素名が付与され、これを使ってアクセスします。
1 2 3 4 5 6 7 |
//要素に名前を付ける例 (int year,int month,int day) ymd = (2021,5,15); Console.Write("{0}年{1}月{2}日",ymd.year,ymd.month,ymd.day); //要素に名前を付けない例 (int,int,int) ymd = (2021,5,15); Console.Write("{0}年{1}月{2}日", ymd.Item1, ymd.Item2, ymd.Item3); |
一方、Pythonのタプルは要素に名前を付けることができず、リストと同じく添え字で各要素にアクセスします。
1 2 |
ymd = (2021,05,15) print("{0}年{1}月{2}日".format(ymd[0],ymd[1],ymd[2])) |
つまり、Pythonのタプルは「要素が書き換えらえないリスト」だと考える事が出来ます。
ということは、リストで使える添え字部分にスライスや for 、if 文を記述して、値を取り出すことが可能だということです。
1 2 3 4 |
data = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) print([x for x in data if x % 2 == 0]) ※[2, 4, 6, 8, 10, 12, 14] が表示される |
値が書き換えられないことから、用意されているメソッドは count と index の2つしかありません。
値が書き換えられないとはいっても、タプルの値として辞書やリストが含まれている場合、それらは書き換え可能です。


辞書
Pythonの辞書(dictionary)は、KeyとValue のペアを1つの単位として管理するもので、Key の重複は出来ないという点はC#と同じです。
しかし、C#のDictionaryよりも手軽に要素(ペア)の追加が可能で、登録順は保持されているところが大きく異なります。
代入する際に指定したキーが辞書に存在すれば値の書き換え、存在しない場合は追加となります。
1 2 3 4 5 6 |
dic = {'key1':10,'key2':20} dic['key1'] = 100 #key2は存在するので書き換え dic['key3'] = 300 #key3は存在しないので追加 print(dic) ※ {'key1': 100, 'key2': 20, 'key3': 300} が表示される |
ちなみに登録順は保持されているというものの、任意の位置に追加は出来ません。
全ての要素をループで取り出したい場合は次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#辞書の初期化 dic = {'key1': 100, 'key2': 20, 'key3': 300} //辞書に含まれるキーを全て取り出す for val in dic: print(val) ※ key1 key2 key3 が順番に表示される //辞書に含まれる値を全て取り出す for val in dic: print(dic[val]) ※ 100 20 300 が順番に表示される |
キーが存在しない場合だけ要素を追加する
辞書名[キー] = 値
と記述することで、書き換えと追加が可能ですが、キーがあれば値をそのままにしておいて、無い時だけ追加したいケースがあります。
キーに含まれるかチェックして、無ければ追加するのですから、if 文を使って次のように書くことが出来ます。
1 2 3 4 |
dic = {'key1': 100, 'key2': 20, 'key3': 300} if not 'key5' in dic: dic['key5'] = 500 |
しかし、Pythonでは setdefault(キー、値)というメソッドが用意されています。
1 2 3 |
dic = {'key1': 100, 'key2': 20, 'key3': 300} dic.setdefault('key5',500) |
既存の辞書に丸ごと別の辞書を追加
辞書の末尾に別の辞書を丸ごと追加したい場合、 update(辞書名) というメソッドを使います。
1 2 3 4 5 6 7 8 9 |
dic = {'key1': 100, 'key2': 20, 'key3': 300} dic2 = {'year':2021,'month':5,'day':15,'key1':999} #dicの末尾にdic2を追加 dic.update(dic2) print(dic) ※ {'key1': 999, 'key2': 20, 'key3': 300, 'year': 2021, 'month': 5, 'day': 15} が表示される |
dic の末尾に dic2 の内容が追加されたのが分かると思います。
dic と dic2 には 値が異なる同一キー ‘key1’ の要素があり、’key1’ が 999 に書き換わっていますが、2つの辞書に同一キーが存在する場合は、追加した辞書の値で上書きされます。
辞書の要素をループで取り出す
タプルやリストから全ての要素を取り出す場合、特に何も考えずループ処理を使うだけなのですが、辞書はキーと値がセットになっているため、少し注意が必要です。
C#の場合、単純に for ループで辞書を参照するとキーと値がペアーになった KeyValuePare という型が返されますが、Pythonの場合は キーだけが返されます。
1 2 3 4 5 6 |
dic = {'key1': 100, 'key2': 20, 'key3': 300} for item in dic: print(item) # key1,key2,key3 が表示される |
C#には、キーだけをコレクションとして返す Keys、値をコレクションとして返す Values が用意されていますが、Pythonでは keys()、values() というメソッドが用意されています。
また、キーと値の両方を取り出す場合は、items() メソッドが用意されており、各要素をタプルで取得することが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dic = {'key1': 100, 'key2': 20, 'key3': 300} #キーを取り出す場合 for val in dic.keys(): print(val) #値を取り出す場合 for val in dic.values(): print(val ) #キーと値の両方を取り出す場合 for val in dic.items(): print(val ) |
セット
例えば大量データの中から重複データを排除したい場合、C#だと辞書のキー部分だけを使って重複チェックを行うか、Linq を使うことになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//データの初期化 int[] data = new int[]{1,2,3,4,5,5,1,5,3,5,8,7,9,6} //C#で辞書を使って重複を排除するサンプル Dictionary<int,int> dic = new Dictionary<int,int>(); foreach(int val in data) { if(! dic.ContainsKey(val)) { dic.Add(val,0); } } //C# で Linq を使って重複を排除するサンプル data.Distinct().ToArray(); |
Python には重複データを許さない set という型が用意されています。
辞書も重複データを許さないので、set はキー部だけを持つ辞書と考える事が出来ます。
変数を初期化する際、リストは [] 、タプルは () 、辞書は {} を使いましたが、セットも {} が使えます。
{要素1,要素2,要素3,・・・}
また、set という関数(実際はset クラスのコンストラクタが呼び出される)の引数にリスト形式で要素を渡して初期化することも出来ます。
set( [要素1,要素2,要素3・・・] )
もう少し具体的に書くと次のようになります。
1 2 3 4 |
data = set([1,2,3,4,4,5,1,3,2,4,1,1,1,3]) # data = {1,2,3,4,4,5,1,3,2,4,1,1,1,3} とも書ける print(data) ※ [1,2,3,4,5] が表示される |
set を使うと、このように重複データを排除してくれるのです。
set関数と list 関数を組み合わせることで、リストから重複を簡単に除くことができます。
1 2 3 4 5 |
data = [1,2,3,4,4,5,1,3,2,4,1,1,1,3] data = list( set(data) ) #set で重複を取り除いてリストに変換 print(data) ※ [1,2,3,4,5] が表示される |
各要素のアクセス
セットの各要素に対して添え字でアクセスすることは出来ません。
ただ、for ループを使って全て取り出す事は出来ます。
1 2 3 4 5 6 |
data = set( [1,2,3,4,5] ) for val in data: print(val) ※ 1 2 3 4 5 が順番に表示 |
要素の追加、変更、削除
添え字による要素の書き換えは出来ませんが、要素の追加、削除、クリアのメソッドは用意されています。
機能 | メソッド名 | 動作 |
---|---|---|
追加 | 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]) が代入されていると仮定すると

メソッド名 | 記述例 | 意味 |
---|---|---|
issubset | s1.issubset(s2) | s1がs2の部分集合(s1の全要素がs2に含まれているか)を判定 |
issuperset | s1.issuperset(s2) | s1がs2の上位集合(s2の全要素がs1に含まれているか)を判定 |
isdisjoint | s1.isdisjoint(s2) | s1とs2の間に重複があるかを判定 |
issubset と issuperset は s1 から見て s2 がどういう集合かを判定するものなので、結果が反対になります。
まとめ
今回はインポートせずに使えるPythonの標準的な変数の型について、一通り解説しました。
また、複数の要素で構成されるリストやタプル、辞書、セットについては、C#と比較しながら詳しく解説しました。
今回の内容はPythonの基礎として押さえておきたいポイントです。
機械学習や数値計算では numpy や pandas というクラスが登場しますが、この説明は次回以降に詳しく解説していきます。