配列(タプル)の特定要素の数を数える
タプル内の特定要素の数を数えるには、countメソッドを利用します。構文は、以下のとおりです。
以下にコードを示します。
tuple.count(x)xが数える特定要素です。
以下にコードを示します。
#!/usr/bin/env python # -*- coding: utf-8 -*- a = (10,20,20,40,50) #10をカウントします。 print a,a.count(10) #20をカウントします。 print a,a.count(20)以下が実行結果です。
>>> (10, 20, 20, 40, 50) 1 (10, 20, 20, 40, 50) 2
配列(タプル)の連番を作る
Pythonでは、連番のタプルを直接作ることはできません(多分)。rangeメソッドでリストを作ったあとで、タプルに変換します。
連番は、start≦連番<stopの値を取ります。
startを省略するとstart=0になります。
stepを省略するとstep=1になります。
tuple(range([start],stop[,step]))startが開始整数、stopが終了整数、stepが各値の差です。
連番は、start≦連番<stopの値を取ります。
startを省略するとstart=0になります。
stepを省略するとstep=1になります。
#!/usr/bin/env python # -*- coding: utf-8 -*- #0~9の連番を作成します。 print tuple(range(10)) #1~10の連番を作成します。 print tuple(range(1, 11)) #0~25を5毎に作成します。 print tuple(range(0, 30, 5)) #-9~0を逆順に作成します。 print tuple(range(0, -10, -1)) #終了整数を0にすると空リストが作成されます。 print tuple(range(0)) #0だけの要素のリストを作るには以下のようにします。 print tuple(range(0,1)) #ありえない値を入力しても空リストが作成されます。 print tuple(range(1, 0))以下が実行結果です。
>>> (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) (0, 5, 10, 15, 20, 25) (0, -1, -2, -3, -4, -5, -6, -7, -8, -9) () (0,) ()
配列(タプル)をコピーする
Pythonのタプルのコピーには、浅いコピー(Shallow copy)と深いコピー(Deep copy)が存在します。
浅いコピーは、リストの各要素をコピーしますが、その要素が参照するデータまではコピーしません。
深いコピーは、リストの各要素もその要素が参照するデータもコピーします。
ただし、タプルは変更不可オブジェクトなので、コピーをしても変更できないため浅いコピーはほとんど意味がないと思われます。
浅いコピーおよび深いコピーは以下のような構文です。
実際のコードを見たほうがわかりやすいので、以下にコードを示します。
浅いコピーは、リストの各要素をコピーしますが、その要素が参照するデータまではコピーしません。
深いコピーは、リストの各要素もその要素が参照するデータもコピーします。
ただし、タプルは変更不可オブジェクトなので、コピーをしても変更できないため浅いコピーはほとんど意味がないと思われます。
浅いコピーおよび深いコピーは以下のような構文です。
import copy copy.copy(tuple) #浅いコピー copy.deepcopy(tuple) #深いコピーまた、浅いコピーには以下のような構文もあります。
tuple[:] tuple(tuple)tupleがコピー元のリストです。
実際のコードを見たほうがわかりやすいので、以下にコードを示します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#コピーモジュールのインポート
import copy
#まずは、単純に代入
a = ('hello','Python','String')
b = a
print a,b
b[1] = 'Jython' #エラーになります。
#次に浅いコピーを行います。
a = ('hello','Python','String')
b = copy.copy(a)
print a,b
b[1] = 'Jython' #エラーになります。
#ただし要素が参照するデータが変わると、話は変わります。
a = ('hello',['Python'],'String')
b = copy.copy(a)
b[1].append('Jython') #2番目の要素はリストなので書き換え可能
print a,b #aもbも書き換わります。
#また浅いコピーは以下のような種類の構文でも可能です。
#一つ目
a = ('hello','Python','String')
b = a[:]
print a,b
b[1] = 'Jython' #エラーになります。
#二つ目
a = ('hello','Python','String')
b = list(a)
print a,b
b[1] = 'Jython' #エラーになります。
#次に深いコピーを行います。
a = ('hello','Python','String')
b = copy.deepcopy(a)
print a,b
b[1] = 'Jython' #エラーになります。
#ただし要素が参照するデータが変わっても影響しません。
a = ('hello',['Python'],'String')
b = copy.deepcopy(a)
b[1].append('Jython') #2番目の要素はリストなので書き換え可能
print a,b #bのみ書き換わります。
以下が実行結果です。
('hello', 'Python', 'String') ('hello', 'Python', 'String')
Traceback (most recent call last):
File "C:\2array_make.py", line 11, in <module>
b[1] = 'Jython' #エラーになります。
TypeError: 'tuple' object does not support item assignment
('hello', 'Python', 'String') ('hello', 'Python', 'String')
Traceback (most recent call last):
File "C:\2array_make.py", line 17, in <module>
b[1] = 'Jython' #エラーになります。
TypeError: 'tuple' object does not support item assignment
('hello', ['Python', 'Jython'], 'String') ('hello', ['Python', 'Jython'], 'String')
('hello', 'Python', 'String') ('hello', 'Python', 'String')
Traceback (most recent call last):
File "C:\2array_make.py", line 28, in <module>
b[1] = 'Jython' #エラーになります。
TypeError: 'tuple' object does not support item assignment
('hello', 'Python', 'String') ['hello', 'Python', 'String']
('hello', 'Python', 'String') ('hello', 'Python', 'String')
Traceback (most recent call last):
File "C:\2array_make.py", line 39, in <module>
b[1] = 'Jython' #エラーになります。
TypeError: 'tuple' object does not support item assignment
('hello', 'Python', 'String') ('hello', 'Python', 'String')
Traceback (most recent call last):
File "C:\2array_make.py", line 39, in <module>
b[1] = 'Jython' #エラーになります。
TypeError: 'tuple' object does not support item assignment
('hello', ['Python'], 'String') ('hello', ['Python', 'Jython'], 'String')
配列(タプル)の要素を並び替える
タプルは変更不可オブジェクトなので、リストのように元のタプル自体を変更するようなメソッドは存在しません。したがって、組み込み関数を利用して並び替えを行います。
タプルを昇順に並び替える組み込み関数として、sortedがあります。
以下のような構文になります。
組み込み関数は、入力したタプル自体は変更されず、返り値としてタプルが返ります。
また、降順に並び替えるには、上述の昇順にする関数を利用した上で、組み込み関数reversedを利用します。構文は、以下のとおりです。
以下のような構文になります。
sorted(tuple)tupleは並び替えられるタプルです。
組み込み関数は、入力したタプル自体は変更されず、返り値としてタプルが返ります。
また、降順に並び替えるには、上述の昇順にする関数を利用した上で、組み込み関数reversedを利用します。構文は、以下のとおりです。
reversed(tuple)reversedはイテレータとして結果を返しますので、リストにする場合は、tuple関数を使う必要があります。ただ、すでに過去の記事で書きましたが、タプルは、スライスを使って以下のような構文で逆順にすることもできます。
tuple[::-1]以下が、それぞれの実行コードです。
#!/usr/bin/env python # -*- coding: utf-8 -*- a = (20,10,'a',50,0,30) #組み込み関数sortedで昇順に並び替えます。 b = sorted(a) print a,b #組み込み関数reversedで並び替えます。 c = reversed(b) print a,c #イテレータで返されるので、タプルに変換します。 print a,tuple(c) #2次元配列(タプル)は、先頭要素を評価して並び替えます。 a = ((50,0,30),(20,10,'a')) b = sorted(a) print b #タプルを逆順にするだけであれば、以下の2通りがあります。 #組み込み関数reversedを使う a = (20,10,'a',50,0,30) print tuple(reversed(a)) #スライスを使う print a[::-1]実行結果は以下のとおりです。
>>>
(20, 10, 'a', 50, 0, 30) [0, 10, 20, 30, 50, 'a']
(20, 10, 'a', 50, 0, 30) <listreverseiterator object at 0x0000000002BAFF98>
(20, 10, 'a', 50, 0, 30) ('a', 50, 30, 20, 10, 0)
[(20, 10, 'a'), (50, 0, 30)]
(30, 0, 50, 'a', 10, 20)
(30, 0, 50, 'a', 10, 20)
配列(タプル)を検索する
タプルの中に特定の要素が含まれているか検索するためには、in文を利用します。構文は、以下のとおりです。
また、タプルの中のどの位置に要素が含まれているかを検索するためには、indexメソッドを利用します。構文は、以下のとおりです。
以下が、それぞれの実行コードです。
x in tuplexが検索要素、tupleがタプルです。 含まれていればTrueを返します。
また、タプルの中のどの位置に要素が含まれているかを検索するためには、indexメソッドを利用します。構文は、以下のとおりです。
tuple.index(x)xが検索要素、tupleがタプルです。 含まれていればその要素の位置を返します(1番目の要素が0、2番目の要素が1です)。存在しない要素を指定した場合は、ValueErrorの例外が発生します。
以下が、それぞれの実行コードです。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a = (10,20,30)
#in文で検索します。
print a,20 in a
#index文で検索します。
print a,a.index(20)
#print a,a.index(40)
#2次元配列(タプル)を検索する場合は、以下のようにする必要があります。
a = [[10,20,30],[40,50,60]]
#in文で検索します。
#これだとそれぞれのタプルが検索されてしまうので、検索にHITしない。
print a,20 in a
#それぞれのタプルを抜き出して検索する必要がある。
for i in a:
print i,20 in i
以下が実行結果です。
>>>
(10, 20, 30) True
(10, 20, 30) 1
(10, 20, 30)
Traceback (most recent call last):
File "C:\2array_make.py", line 9, in <module>
print a,a.index(40)
ValueError: tuple.index(x): x not in tuple
[[10, 20, 30], [40, 50, 60]] False
[10, 20, 30] True
[40, 50, 60] False

