Skip to main content

4 posts tagged with "Sequence"

View All Tags

Python: 文字列の上位型であるシーケンス型の構文 - Sequence[X:Y:Z]

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

データの順序が存在するデータ型としてシーケンス型があり、文字列型の上位型となっています。このシーケンス型には文字列中の文字の抽出や操作を簡略化する分かりやすい構文がありますので、これを確認してみましょう。

String[X:] はString[X]から末尾までの文字を持つ文字列

#!/usr/bin/python
# coding: UTF-8
s = 'abcdefg'
print 's ', s
print 's[0:] ', s[0:]
print 's[1:] ', s[1:]
print 's[-1:] ', s[-1:]
print 's[-5:] ', s[-5:]

実行結果

s abcdefg
s[0:] abcdefg
s[1:] bcdefg
s[-1:] g
s[-5:] cdefg

String[:Y] は文字列の先頭からString[Y-1]までの文字を持つ文字列

s = 'abcdefg'
print 's ', s
print 's[:3] ', s[:3] # s[0] s[1] s[2]まで
print 's[:-1] ', s[:-1] # Yは-1よりs[(-1)-1]→s[-2]までの文字列
print 's[:-5] ', s[:-5]

実行結果

s abcdefg
s[:3] abc
s[:-1] abcdef
s[:-5] ab

String[::Z] は文字列の先頭から末尾まで Z 間隔で文字を抽出した文字列

s = 'abcdefg'
print 's ', s
print 's[::1] ', s[::1] # 1間隔なのでsと同じ
print 's[::2] ', s[::2]
print 's[::-1]', s[::-1] # 「-」を付けると逆順に辿っていきます

実行結果

s abcdefg
s[::1] abcdefg
s[::2] aceg
s[::-1] gfedcba

文字列の文字順序を逆順にする処理を構文で賄えるのは良いですね。汎用性があって。

上述の複合 - String[X:Y:Z]

s = 'abcdefg'
print 's ', s
print 's[1:3] ', s[1:3]
print 's[:-1:2] ', s[:-1:2]
print 's[-1::-2]', s[-1::-2]
print 's[1:4:2] ', s[1:4:2]

実行結果

s abcdefg
s[1:3] bc
s[:-1:2] ace
s[-1::-2] geca
s[1:4:2] bd

チュートリアル

リファレンス

Python: リストの上位型であるシーケンス型の構文 - Sequence[X:Y:Z]

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

データの順序が存在するデータ型としてシーケンス型があり、リストの上位型となっています。このシーケンス型には要素の抽出や操作を簡略化する分かりやすい構文がありますので、これを確認してみましょう。

List[X:] はList[X]から末尾までの要素を持つリスト

#!/usr/bin/python
# coding: UTF-8
a = [10, 20, 30, 40, 50]
print 'a ', a
print 'a[0:] ', a[0:]
print 'a[1:] ', a[1:]
print 'a[-1:] ', a[-1:]
print 'a[-5:] ', a[-5:]

実行結果

a [10, 20, 30, 40, 50]
a[0:] [10, 20, 30, 40, 50]
a[1:] [20, 30, 40, 50]
a[-1:] [50]
a[-5:] [10, 20, 30, 40, 50]

List[:Y] はListの先頭からList[Y-1]までの要素を持つリスト

a = [10, 20, 30, 40, 50]
print 'a ', a
print 'a[:3] ', a[:3] # a[0] a[1] a[2]まで
print 'a[:-1] ', a[:-1] # Yは-1よりa[(-1)-1]→a[-2]までのリスト
print 'a[:-5] ', a[:-5]

実行結果

a [10, 20, 30, 40, 50]
a[:3] [10, 20, 30]
a[:-1] [10, 20, 30, 40]
a[:-5] []

List[::Z] はListの先頭から末尾まで Z 間隔で要素を抽出したリスト

a = [10, 20, 30, 40, 50]
print 'a ', a
print 'a[::1] ', a[::1] # 1間隔なのでaと同じ
print 'a[::2] ', a[::2]
print 'a[::-1]', a[::-1] # 「-」を付けると逆順に辿っていきます

実行結果

a [10, 20, 30, 40, 50]
a[::1] [10, 20, 30, 40, 50]
a[::2] [10, 30, 50]
a[::-1] [50, 40, 30, 20, 10]

リストの要素順序を逆順にする処理を構文で賄えるのは良いですね。

上述の複合 - List[X:Y:Z]

a = [10, 20, 30, 40, 50]
print 'a ', a
print 'a[1:3] ', a[1:3]
print 'a[:-1:2] ', a[:-1:2]
print 'a[-1::-2]', a[-1::-2]
print 'a[1:4:2] ', a[1:4:2]

実行結果

a [10, 20, 30, 40, 50]
a[1:3] [20, 30]
a[:-1:2] [10, 30]
a[-1::-2] [50, 30, 10]
a[1:4:2] [20, 40]

チュートリアル

リファレンス

Python: 10進数整数を2進数文字列に変換する関数

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

2進数文字列を10進数整数に変換する関数int()はありますが、

>>> int('1011', 2)
11

その逆の、10進数整数を2進数文字列に変換する関数が(Python2.5では)見当たらなかったので、書いてみました。

ソースコード

#!/usr/bin/python
# coding: UTF-8
import math, string
# 10進数整数を2進数文字列に変換する関数
# decimal : 10進数整数
# press : 上位桁の0を切り詰めるフラグ
def toBinary(decimal, press=True):
if decimal == 0: return '0'
bin_str = ""
i = 31
while i >= 0:
bi = int((decimal & int(math.pow(2, i))) >> i)
bin_str += str(bi)
i -= 1
if press:
try:
bin_str = bin_str[bin_str.index('1'):]
except ValueError:
print 'error'
bin_str = '0'
return bin_str
bin_arr = [toBinary(i) for i in range(21)]
print '10進数t2進数'
for i in range(len(bin_arr)):
print '%2dt%5s' % (i, bin_arr[i])

Pythonでは明示的に型変換する必要がありますので、所々int()、str()を用いて型直ししています。

実行結果

10進数 2進数
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
16 10000
17 10001
18 10010
19 10011
20 10100

追記: 32bit以上の整数を扱う場合

参考: 10進数を2進数と16進数に変換する - gan2 の Ruby 勉強日記 ↑の記事で、データサイズにかかわらず処理できるRubyプログラムがありましたので、参考させていただきました。

def toBinary2(decimal):
if decimal == 0: return '0'
bin_str = ""
while decimal > 0:
bin_str += str(decimal % 2)
decimal >>= 1
return bin_str[::-1]

実行結果は上と同じです。

リファレンス

Python: リストの抽出・連結・要素の追加

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#!/usr/bin/python
# coding: UTF-8
# リストの初期化
num1 = [1, 4, 7, 12, 23, 41, 88, 96]
num2 = [100, 130, 255, 1000]
str1 = ['Jon', 'Mery', 'Sun', 'Ren']
str2 = ['hi', 'hello', 'hey', 'bye', 'ya']
# リストの要素を出力
print num1[3]
print num2[-2]
print
# リストの範囲を指定して抽出(シーケンス型に備わっている操作)
extr_n1 = num1[:-3] # 先頭から最末尾の3つ手前の要素までのリストを抽出
print extr_n1
extr_n2 = num1[2:] # 添え字の2から末尾までの要素のリストを抽出
print extr_n2
extr_s1 = str2[1:-2] # 添え字の1から末尾の2つ手前の要素までのリストを抽出
print extr_s1
extr_n3 = num1[1:6:2] # 1から5まで2つとびのリストを抽出
print extr_n3
extr_n4 = num1[1:6]
print extr_n4
print
# リストの連結
cmbn = num1 + num2 # 2項演算子'+'で連結
print cmbn
cmbs = str1 + str2
print cmbs
cmbhy = num1 + str1 # 中の要素が異なっていてもOK
print cmbhy
print
# リストの連結(データ型を文字列に変更)(文字列のメソッド)
print cmbs
ch = ','
cmb1 = ch.join(cmbs) # joinの引数にはstring要素のリストを。cmbnだとエラー
print type(cmb1)
print cmb1
print
# リストに要素の追加(注:データそのものを書き換える)
num3 = [1100, 1130, 1255, 1300]
print num3
num3.append(3)
print num3
str3 = ['hi', 'hello', 'hey', 'bye', 'ya']
print str3
str3.append('Yap')
print str3
print

実行結果

12
255
[1, 4, 7, 12, 23]
[7, 12, 23, 41, 88, 96]
['hello', 'hey']
[4, 12, 41]
[4, 7, 12, 23, 41]
[1, 4, 7, 12, 23, 41, 88, 96, 100, 130, 255, 1000]
['Jon', 'Mery', 'Sun', 'Ren', 'hi', 'hello', 'hey', 'bye', 'ya']
[1, 4, 7, 12, 23, 41, 88, 96, 'Jon', 'Mery', 'Sun', 'Ren']
['Jon', 'Mery', 'Sun', 'Ren', 'hi', 'hello', 'hey', 'bye', 'ya']
<type 'str'>
Jon,Mery,Sun,Ren,hi,hello,hey,bye,ya
[1100, 1130, 1255, 1300]
[1100, 1130, 1255, 1300, 3]
['hi', 'hello', 'hey', 'bye', 'ya']
['hi', 'hello', 'hey', 'bye', 'ya', 'Yap']

リファレンス

チュートリアル